调用具有多个参数的宏定义的语法

调用具有多个参数的宏定义的语法

在我的简单示例中,我尝试将文本格式分解为多个宏定义。我使用 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{

相关内容