我想写一个命令。
这是命令应该实现的示例:
\begin{alignat}{1}
Hello \\
Hello two \\
Hello three
\end{alignat}{1}
命令看起来应该是这样的:
\mycommand {
\command{Hello}
\command{Hello two}
\command{Hello three}
}
\mycommand 有一个参数,它将包含一个命令列表。它将\begin{alignat}{1}
在所有命令之前和\end{alignat}{1}
所有命令之后放置一个。它将在每个命令之间插入一个\\
(在最后一个命令之后\\
插入 no,这是最困难的部分)。
在此示例\command
中
\newcommand{\command}[1]{#1}
问题是我该如何写\mycommmand
答案1
下面是一个实现\mycommand
,\command
可以提供您所追求的内容:
\documentclass{article}
\usepackage{amsmath}
\begin{document}
Some text before.
\begin{alignat}{1}
\text{Hello} \\
\text{Hello two} \\
\text{Hello three}
\end{alignat}
Some text after.
\noindent
\hrulefill
\newcommand{\mycommand}[1]{%
\begin{alignat}{1} #1 \end{alignat}%
}%
Some text before.
\mycommand{
\text{Hello} \\
\text{Hello two} \\
\text{Hello three}
}%
Some text after.
\noindent
\hrulefill
\makeatletter
\renewcommand{\mycommand}[1]{%
\begin{alignat}{1} #1\null \end{alignat}%
}%
\def\@afterfi#1\fi{\fi#1}%
\newcommand{\command}[1]{\text{#1} \@ifnextchar\null{}{\\}}%
\makeatother
Some text before.
\mycommand{
\command{Hello}
\command{Hello two}
\command{Hello three}
}%
Some text after.
\end{document}
\null
在 的参数末尾插入一个附加标记,并用作使用\mycommand
中的检查\command
\@ifnextchar
。
答案2
仅使用设施来实现这一点xparse
很复杂。以下是使用一些函数的实现expl3
:
\documentclass{article}
\usepackage{amsmath,xparse}
\ExplSyntaxOn
\seq_new:N \l_mycommand_lines_seq
\seq_new:N \l_mycommand_output_seq
\NewDocumentCommand{\mycommand}{m}
{
\seq_set_split:Nnn \l_mycommand_lines_seq { \command } { #1 }
\seq_pop_left:NN \l_mycommand_lines_seq \l_tmpa_tl
\seq_set_map:NNn \l_mycommand_output_seq \l_mycommand_lines_seq
{ \exp_not:n { \command { ##1 } } }
\begin{align}
\seq_use:Nn \l_mycommand_output_seq { \\ }
\end{align}
}
\cs_generate_variant:Nn \tl_if_blank:nT { x }
\ExplSyntaxOff
\newcommand{\command}[1]{#1}
\begin{document}
\mycommand{
\command{Hello}
\command{Hello &= two}
\command{Hello &= three}
}
\end{document}
输入在\command
标记处被拆分;空格将被自动修剪。序列中的第一个元素被弹出,因为它是空的。然后序列被映射到重新插入\command
项之前(但可以使用不同的宏)。然后结果序列是用过的任意\\
两个项目之间。
答案3
这会\\
在参数中的每个标记后添加一个。
\ExplSyntaxOn
\NewDocumentCommand\mycommand{m}
{
\tl_map_inline:nn {#1} {##1\\}
}
\ExplSyntaxOff