是否存在类似物\ignorespaces
也会忽略以下\par
内容?
答案1
这里有两个宏,它们要么忽略所有空格和隐式段落(空分隔线),要么也忽略显式\par
宏。两者都基于这样一个事实:\@ifnextchar
用于向前看的 也会在读取下一个标记之前消耗可选空格。这可以安全地使用\ignorespaces
。在第一种情况下,该标记无关紧要,\@ifnextchar
只是用于获取 的功能\ignorespaces
,但允许我们在空格消失后将代码放在其后面。
我在思考如何针对我的应用程序优化 Leo 的答案时想到了这个解决方案。
\documentclass{article}
\makeatletter
\def\ignorespacesandimplicitepars{%
\begingroup
\catcode13=10
\@ifnextchar\relax
{\endgroup}%
{\endgroup}%
}
\def\ignorespacesandallpars{%
\begingroup
\catcode13=10
\@ifnextchar\par
{\endgroup\expandafter\ignorespacesandallpars\@gobble}%
{\endgroup}%
}
\makeatletter
% Test cases
\let\ignorespacesandpars\ignorespacesandimplicitepars
%\let\ignorespacesandpars\ignorespacesandallpars
\begin{document}
\def\test#1{#1\ignorespacesandpars}
\test{testa} \test{testb}
\test{testc}
\test{testd}
\test{teste}
\par
\test{testf}
\end{document}
答案2
\documentclass{minimal}
\makeatletter
\begingroup
\catcode13=12%
\gdef\gobble@ignorespacesandpars#1{\ignorespacesandpars}%
\gdef\ignorespacesandpars{%
\catcode13=12%
\@ifnextchar^^M{\gobble@ignorespacesandpars}{\catcode13=5}}%
\endgroup
\makeatletter
\begin{document}
\def\test#1{-#1-\ignorespacesandpars}
foo\test{and} bar
foo\test{and}
bar
foo bar
\end{document}
结果:
foo-and-bar
foo-and-bar
foo bar
答案3
\def\ignorepar{\penalty 10001 \penalty 10003
\def\par{\ifnum\lastpenalty=10003 \unpenalty \ifnum \lastpenalty=10001 \unpenalty
\else \endgraf \fi \else \endgraf \fi \let\par\endgraf}\ignorespaces}
注意:您可以接受超过 10000 的任何惩罚。选择 10001 和 10003 是因为我相信 10001 和 10003 通常连续出现的概率非常低。
更简单的情况:
\def\ignorepar{\penalty 12674 \def\par{\ifnum\lastpenalty=12674 \unpenalty \else \endgraf \fi \let\par\endgraf}\ignorespaces}
編輯:沒有失敗如果有多个空白行。
\def\ignorepar{\penalty 12674
\def\par{\ifnum\lastpenalty=12674 \else \endgraf \let\par\endgraf \fi}\ignorespaces}