有没有办法计算命令参数中的段落数?我想创建一个命令来执行如下操作:
\newcounter{\numberofparagraphs}
\newcommand{\testcmd}[1]{
\setcounter{\numberofparagraphs}{ ???? }
\ifthenelse{\equal{\numberofparagraphs}{1}}
{ \testcmdOneParagraph{#1} }
{ \testcmdMoreThenOneParagraph{#1} }
}
因此,如果输入参数只有一个段落,命令将执行一件事,否则它将执行另一件事。
这可能吗?
答案1
以下代码似乎在我的简单测试中有效。参数在已保存的框内排版,该框在\par
增加计数器时从未使用过。LaTeX\addtocounter
全局增加了计数器,因此在框和组结束后更改仍将保留。请注意,这会对内容进行两次排版,效率不高,可能会产生隐藏的副作用。但是,风险很低,因为代码是在组中执行的,并且从未真正添加到文档中,因此\label
s 等永远不会写入文件.aux
。
我使用了一个minipage
,这样材料就可以在可以容纳多个段落的正常环境中排版。我不能 100% 确定这是否是必需的或正确的,但据我所知,它可以完成工作。
\documentclass{article}
\newcounter{numberofparagraphs}
\makeatletter
\newcommand{\testcmd}[1]{%
\setcounter{numberofparagraphs}{0}%
{\sbox\@tempboxa{%
\begin{minipage}{\linewidth}%
\let\origpar\par% Might not be required
\def\par{\origpar\addtocounter{numberofparagraphs}{1}}%
#1%
\end{minipage}%
}}%
\ifnum\value{numberofparagraphs}<2
\testcmdOneParagraph{#1}%
\else
\testcmdMoreThenOneParagraph{#1}%
\fi
}
\makeatother
\newcommand{\testcmdOneParagraph}[1]{Only One: #1}
\newcommand{\testcmdMoreThenOneParagraph}[1]{More: #1}
\begin{document}
\testcmd{test}
\testcmd{%
test test test
}
\testcmd{%
test test test
%
test test test
}
\testcmd{%
test test test
test test test
}
\testcmd{%
test test test
\par
test test test
}
\end{document}