如何将行尾字符用作宏参数?我想要类似这样的内容:
\def\mymacro#1\endlinechar{Content:#1}
\mymacro First content
\mymacro Second content
给出以下输出:
Content: First content
Content: Second content
我已尝试过\endlinechar
,\^^M
但效果并不那么容易。
答案1
在标准设置下,行尾字符不可用于主输入流,即
\endlinechar=`\^^M
\catcode`\^^M=5
(看各种引擎中的 ^^ 符号了解有关^^
符号的信息)。
当 TeX 看到类别代码为 5 的字符时,它会立即将其转换为空格或标记(\par
如果后面还有另一个标记)(可能在“跳过空格”阶段之后)。当它看到(操作系统定义的)记录结尾时,它会将其连同行尾的所有内容一起丢弃,删除所有尾随空格并插入\endlinechar
。
通常 的\endlinechar
类别代码为 5,但这不是强制性的,可以通过更改类别代码获得不同的效果。例如,\obeylines
使其\^^M
成为活动角色并赋予其与 相同的含义\par
。
对于你的应用程序,你可以查看 TeX by Topic 的第 11.9.4 节;基本上你可以这样做
\def\mymacro{\begingroup\catcode`\^^M=12 \xmymacro}
{\catcode`\^^M=12 %
\gdef\xmymacro#1^^M{Content: #1\endgroup}%
}
更改类别代码^^M
必须在小组中完成,否则您最终会陷入困境。
但是,我不建议这样做:编辑可能对你在何时结束行有不同的看法,误按某个键可能会毁掉你的工作。此外,\mymacro
在另一个宏的参数中使用内部参数肯定行不通。
重要的提示
上面提到的行尾字符是不是系统相关的记录终止符。当 TeX(任何实现它的引擎)读取一行时,操作系统会告知它记录终止符是什么;找到它后,它会将其与同一行上它后面的所有内容一起丢弃;然后它会删除尾随空格(字符代码 32)和制表符(字符代码 9);最后它会插入具有与当前值相等的代码的字符\endlinechar
。
因此,记录终止符是 CR(ASCII 13)、LF(ASCII 10)还是 CR+LF,或者什么都不是(例如传统 IBM 大型机),都无关紧要。
TeX Live 实现允许上述任意组合(CR、LF 或 CR+LF):它检查文件的第一行并决定要通知 TeX 的行终止符。
答案2
OPmac 定义:
\def\eoldef#1{\def#1{\begingroup \catcode`\^^M=12 \eoldefA#1}%
\expandafter\def\csname\string#1:M\endcsname}
{\catcode`\^^M=12\gdef\eoldefA#1#2^^M{\endgroup\csname\string#1:M\endcsname{#2}}}
然后你可以定义你的宏:
\eoldef\foo#1{\message{param: "#1"}}
您可以使用它:
\foo this is parameter
and this is next text.