在我的简单示例中,我尝试将文本格式分解为多个宏定义。我使用 miktex disribution 的 xelatex 将其编译为 pdf。
问题是为什么第二个%FORM 2
定义不起作用而第一个%FORM 1
定义却能正常工作。
\documentclass{article}
\def\transformrawinput#1,#2,#3,#4 {\textit{#1} \textbf{#2} \underline{#3} #4}
%FORM 1
%\def\finaltransfmormations{\transformrawinput\firstword,\secondword,\thirdword,\forthword \\ \rule{\textwidth}{1pt}}
%FORM 2
\def\finaltransfmormations{\transformrawinput{\firstword}{\secondword}{\thirdword}{\forthword} \\ \rule{\textwidth}{1pt}}
\def\firstword{one}
\def\secondword{two}
\def\thirdword{four}
\def\forthword{five}
\begin{document}
\finaltransfmormations
\end{document}
干杯!
Runaway argument?
{\firstword }{\secondword }{\thirdword }{\forthword } \\ \rule {\textwidth \ETC
.
! File ended while scanning use of \transformrawinput.
<inserted text>
\par
<*> ./test_edef_def.tex
?
答案1
整合一些评论:
以下是有效的 TeX:
\def\withcomma#1,#2{:#1:#2:}
\def\withoutcomma#1#2{:#1:#2:}
\withcomma one,two
\withoutcomma{one}{two}
\bye
输出
:one:t:wo
:one:two:
您\def\transformrawinput
指定了它的四个参数将用逗号分隔,这就是FORM 1
使用的。如果您想用括号指定参数,那么您不希望逗号出现在宏定义中。但是您的逗号方法存在一个问题:因为您从未给出结束分隔符,所以 TeX 将下一个标记作为最后一个参数。这实际上是您认为的最后一个参数的首字母。这意味着它应该被称为\withcomma one,{two}
。但是如果您无论如何都必须用括号括住参数,那么您最好删除逗号。
但你说你使用的是 (Xe)LaTeX,而不是 XeTeX。在这种情况下,\def
有效,因为 LaTeX 是基于 TeX 构建的,但你应该使用 LaTeX 方法\newcommand{\withoutcomma}[2]{:#1:#2:}
或\NewDocumentCommand{\withoutcomma}{mm}{:#1:#2:}
(可能\usepackage{xparse}
),这样你最终会得到
\documentclass{article}
%\newcommand{\withoutcomma}[2]{:#1:#2:} % or
\usepackage{xparse} % for TeX prior to 2022
\NewDocumentCommand{\withoutcomma}{mm}{:#1:#2:}
\begin{document}
\withoutcomma{one}{two}
\end{document}
答案2
\def
值得注意的是, LaTeX 强烈不鼓励使用宏,并且使用宏会带来风险。
对于调用 %FORM 2 的宏定义的正确语法的问题,如下(所有功劳归功于@schtandard 在评论中的回答):
\def\transformrawinput#1#2#3#4{