在纯 Tex 宏中使用行尾分隔符

在纯 Tex 宏中使用行尾分隔符

如何将行尾字符用作宏参数?我想要类似这样的内容:

\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.  

相关内容