我们将使用以下简洁的代码用户 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}
它产生以下内容:
现在,假设我们想引入一个额外的命令(例如\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 解决方案的同一主题,您可以使用\doquadruplegroupempty
ConTeXt:
\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
包含您想要在pair
s 之间插入的任何内容以使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}