Xparse 在每个命令后添加反斜杠

Xparse 在每个命令后添加反斜杠

我想写一个命令。

这是命令应该实现的示例:

\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

相关内容