计算命令参数中的段落数

计算命令参数中的段落数


有没有办法计算命令参数中的段落数?我想创建一个命令来执行如下操作:

\newcounter{\numberofparagraphs}  
\newcommand{\testcmd}[1]{  
    \setcounter{\numberofparagraphs}{ ???? }  
    \ifthenelse{\equal{\numberofparagraphs}{1}}
        { \testcmdOneParagraph{#1} }
        { \testcmdMoreThenOneParagraph{#1} }  
}

因此,如果输入参数只有一个段落,命令将执行一件事,否则它将执行另一件事。

这可能吗?

答案1

以下代码似乎在我的简单测试中有效。参数在已保存的框内排版,该框在\par增加计数器时从未使用过。LaTeX\addtocounter全局增加了计数器,因此在框和组结束后更改仍将保留。请注意,这会对内容进行两次排版,效率不高,可能会产生隐藏的副作用。但是,风险很低,因为代码是在组中执行的,并且从未真正添加到文档中,因此\labels 等永远不会写入文件.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}

相关内容