寻找 \ignorespacesandpars

寻找 \ignorespacesandpars

是否存在类似物\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}

相关内容