宏 - 对任意(偶数)个参数重复该模式,对之间有额外的命令

宏 - 对任意(偶数)个参数重复该模式,对之间有额外的命令

我们将使用以下简洁的代码用户 Werner 的回答来自 OP”宏 - 对任意(偶数)个参数重复该模式“:

\documentclass{article}

\makeatletter
\newcommand{\ByTwo}{\@ifnextchar\StopByTwo\relax\@ByTwo}
\newcommand{\@ByTwo}[2]{ {\bfseries #1} {`#2'} \ByTwo}
\makeatother
\let\StopByTwo\relax

\begin{document}

\ByTwo{A}{B}\StopByTwo

\ByTwo{A}{B}{C}{D}{E}{F}\StopByTwo

\ByTwo ABCDEF\StopByTwo

\end{document}

它产生以下内容:

来自 Werner 的回答

现在,假设我们想引入一个额外的命令(例如\endgraf在每个一对,但最后一对则不然。换句话说:每对之间

请问如何实现这一点?

答案1

使用 TeX 原语,您的问题可以按如下方式解决:

\def\byTwo{\def\byTwoS{\def\byTwoS{ -- }}\futurelet\next\byTwoA}
\def\byTwoA{\ifx\bgroup\next\expandafter\byTwoB\fi}
\def\byTwoB#1#2{\byTwoS{\bf#1} `#2'\futurelet\next\byTwoA}

\byTwo{A}{B}{C}{D}{E}{F}

\byTwo{A}{B}

\end

注意,原生的 TeX 语言非常紧凑。我们只需要三行宏就可以解决您的问题。

答案2

基于我为您上一个问题发布的 ConTeXt 解决方案的同一主题,您可以使用\doquadruplegroupemptyConTeXt:

\unexpanded\def\ByTwo
    {\doquadruplegroupempty\doByTwo}

\def\doByTwo#1#2%
    {{\bf #1} ‘#2’
     \ifthirdargument
       --% Replace by whatever you want
       \expandafter\ByTwo
     \fi}

\starttext
\startlines
\ByTwo{A}{B}
\ByTwo{A}{B}{C}{D}
\ByTwo{A}{B}{C}{D}{E}{F}
\stoplines
\stoptext

这使

在此处输入图片描述

如果你从 ConTeXt 复制了 的定义,同样的代码也可以在 LaTeX 中使用\doquadrupleargument。下面我附上了一个来自 的稍微简化的代码syst-gen.mkii

\documentclass{article}
\newif\iffirstargument
\newif\ifsecondargument
\newif\ifthirdargument
\newif\iffourthargument


\def\dodogetgroupargument
  {\ifx\nextargument\bgroup
     \def\nextargument{\dogroupargumentyes\dodogetargument}%
   \else
       \def\nextargument{\dogroupargumentnop\dodogetargument{}}%
   \fi
   \nextargument}%

\def\dogetgroupargument#1#2%
  {\let\dogroupargumentyes#1%
   \let\dogroupargumentnop#2%
   \futurelet\nextargument\dodogetgroupargument}


\def\doquadruplegroupempty#1%
  {\def\dodogetargument##1%
     {\def\dodogetargument####1%
        {\def\dodogetargument########1%
           {\def\dodogetargument%
              {#1{##1}{####1}{########1}}%
            \dogetgroupargument\fourthargumenttrue\fourthargumentfalse}%
         \dogetgroupargument\thirdargumenttrue\thirdargumentfalse}%
      \dogetgroupargument\secondargumenttrue\secondargumentfalse}%
   \dogetgroupargument\firstargumenttrue\firstargumentfalse}

\protect\def\ByTwo
    {\doquadruplegroupempty\doByTwo}

\def\doByTwo#1#2%
    {{\bfseries #1} `#2'
     \ifthirdargument
       -- % Replace by whatever you want
       \expandafter\ByTwo
     \fi}


\begin{document}

\ByTwo{A}{B} 

\ByTwo{A}{B}{C}{D} 

\ByTwo{A}{B}{C}{D}{E}{F}
\end{document}

答案3

您可以使用以下方式在每对之间插入内容狡猾的拖延战术

在此处输入图片描述

\documentclass{article}

\newcommand{\pairdiff}{--}
\makeatletter
% Delay the use of \pairdiff by one \ByTwo (https://tex.stackexchange.com/a/89187/5764)
\def\@newpair{\def\@newpair{\pairdiff}}
\newcommand{\ByTwo}{\@ifnextchar\StopByTwo{\def\@newpair{\def\@newpair{\pairdiff}}}\@ByTwo}
\newcommand{\@ByTwo}[2]{\@newpair{\bfseries #1} {`#2'} \ByTwo}
\makeatother
\let\StopByTwo\relax

\begin{document}

\ByTwo{A}{B}\StopByTwo

\ByTwo{A}{B}{C}{D}{E}{F}\StopByTwo

\ByTwo ABCDEF\StopByTwo

\end{document}

\pairdiff包含您想要在pairs 之间插入的任何内容以使diff它们突出。

答案4

对代码进行稍微的重组就可以以最小的努力实现扩展。

\documentclass{article}

\makeatletter
\newcommand{\ByTwo}[2]{{\bfseries #1} {`#2'}\@ByTwo}
\newcommand{\@ByTwo}{\@ifnextchar\relax{}{\PairSep\ByTwo}}
\makeatother

\newcommand{\PairSep}{ -- }% customize as desired

\usepackage{color}

\begin{document}

\ByTwo{A}{B}\relax

\ByTwo{A}{B}{C}{D}{E}{F}\relax

\ByTwo ABCDEF\relax

\renewcommand{\PairSep}{\textcolor{blue}{::::::}}

\ByTwo ABCDEF\relax

\end{document}

在此处输入图片描述

相关内容