区分 \def 参数中的空格(ASCII 32)和返回(ASCII 13)

区分 \def 参数中的空格(ASCII 32)和返回(ASCII 13)

相关问题可以看这里。我希望 \mydef 行为是

\mydef{a b c d}

获得正确的出口,但

\mydef{a b
 c d}

或者

\mydef{a b c d
}

得到错误的导出(如警告消息)。

答案1

如果我正确理解了您的问题,以下内容将按照您的要求进行操作,它会在编译时引发错误:

\documentclass{article}

\def\mydef{\catcode13=15\relax\mydefi}

\def\mydefi#1{\catcode13=5\relax\mydefii#1}

\def\mydefii#1 #2 #3 #4{%
\textbf{#1}\textit{#2}\textsc{#3}\textsl{#4}}

\begin{document}
\mydef{A B C D} foo

\mydef{a b c d}

%% \mydef{a b
%%  c d}

%% or

\mydef{a b c d
}

\end{document}

注释掉的行也会引起错误。如果你只是想要某种警告,可以使用以下命令:

\documentclass{article}

\newif\ifwarn
\makeatletter

\def\mydef{\catcode13=\active\begingroup\lccode`\~=13\relax
     \lowercase{\endgroup\let~\stop}\mydefi}

\def\myparse #1{\ifnot@nil{#1}{\ifx #1\stop\warntrue\fi\myparse}}

\def\mydefi#1{\catcode13=5\myparse #1\@nil
      \ifwarn ERROR IN TEX SOURCE\warnfalse\else\mydefii#1\fi}

\def\mydefii#1 #2 #3 #4{%
\textbf{#1}\textit{#2}\textsc{#3}\textsl{#4}}

\makeatother

\begin{document}
\mydef{A B C D} foo
\mydef{a b
 c d}
\mydef{a b c d}

\mydef{a b
 c d}

\mydef{a b
 c 
 d}

\mydef{A B C D} foo

\mydef{a b c d
}

\end{document}

答案2

\documentclass{article}
\def\mydef#1{\expandafter\mydefi#1}
\def\mydefi#1 #2 #3 #4{\textbf{#1}\textit{#2}\textsc{#3}\textsl{#4}}
\begin{document}
\mydef{A B C D} foo

\mydef{a b c d}

\mydef{a b
 c d}

or

\mydef{a b c d
}
\end{document}

相关内容