我有一个用例,我想为通过命令输入的文本指定一些特殊格式\input
。此文本是以某种形式打印的客户地址。理想情况下,输入文件不应包含任何 TeX 命令,并注意换行符。
因此如果输入文件是:
John Doe
Some Street X
ZIP City
LaTeX 模板包含:
\begin{customer}
\input{customer}
\end{customer}
我知道如何创建新环境,但如何保留换行符customer.tex
。我不希望.tex
文件包含\\
换行符。Verbatim 环境不太适合这里,因为它使用自己的字体和格式。
PS:简短说明:verbatim
环境不起作用,因为它不保留客户环境中的格式。我需要将换行符功能合并到我的客户环境中。例如,客户环境可能导致文本被格式化为{\large \textsc{...}}
,或其他格式。
答案1
这种语法是多余的:类似的\custinput{customer}
可能更好;让我们试试:
\newcommand{\custinput}[1]{%
\begingroup\setlength{\parindent}{0pt}\obeylines
\input{#1}\endgroup}
\custinput{customer}
\obeylines
LaTeX 借用了以下宏plain.tex
:其定义是
\def\obeylines{\catcode`\^^M\active\let^^M\par}
说\catcode\endlinechar\active
可能更安全,但行尾字符与默认行尾字符不同并不常见。此类命令应在组内发出,否则其效果将“永远”持续下去。在此组中,活动行尾被定义为等同于\par
。
一点理论:在处理操作系统的记录结束信号后,TeX 会在它读取的每一行后附加一个字符。这是因为每个操作系统对于记录的结束方式都有自己的想法;有些操作系统使用组合<CR><LF>
,有些操作系统只使用<LF>
,有些操作系统只使用<CR>
(<CR>
是 ASCII 13,<LF>
是 ASCII 10)。其他操作系统根本不使用任何字符,因为它们的记录具有固定长度,并且记录由 ASCII<NUL>
字符甚至空格填充。
TeX 默认附加的行尾字符是<CR>
,但它取决于整数参数的值\endlinechar
(其初始值为 13)。如果此值为负数,则不插入行尾字符:这在应用程序中有时很有用。此字符的类别代码通常为 5,这意味着连续两个这样的字符将转换为\par
(忽略行首的空格),否则将转换为空格。由此得出空白行结束段落的属性。
设置此字符的类别代码\active
(即 13)允许我们将其定义为任何我们想要的;我们将使用默认含义,即\par
,这将达到预期的效果。将 ASCII 13 称为字符的一种方便方法是^^M
。但是我们不能说
\newcommand{\custinput}[1]{\begingroup
\catcode`^^M=\active \def^^M{something}%
\input{#1}\endgroup}
因为在定义时,的类别代码^^M
是不是13. 的真正定义\obeylines
是
{\catcode`\^^M=\active % these lines must end with %
\gdef\obeylines{\catcode`\^^M\active \let^^M\par}%
\global\let^^M\par} % this is in case ^^M appears in a \write
这也说明了为什么\obeylines
在定义中使用“更优雅”。
答案2
在customer
环境中您可以更改类别代码\endlinechar
:
\documentclass{article}
\newenvironment{customer}
{\setlength\parindent{0pt}\catcode\endlinechar13}
{}
\begin{document}
\begin{customer}
\input{file}
\end{customer}
\end{document}