换行感知自定义环境

换行感知自定义环境

我有一个用例,我想为通过命令输入的文本指定一些特殊格式\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}

\obeylinesLaTeX 借用了以下宏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}

相关内容