我怎样才能“输入”一个文件而不得到隐式换行符?

我怎样才能“输入”一个文件而不得到隐式换行符?

介绍

我正在开发一个轻量级包,它允许您将任何内容(通常是 LaTeX 代码)放入环境中,然后多次使用该内容,每次单独扫描,因此您可以将其用作逐字输出并解释为 LaTeX。

它的主要目的是并排排版 LaTeX 代码及其“结果”;这对于记录 TeX 包非常有用,而无需复制/粘贴代码。但它还有其他用途。

经过不断的尝试\scantokens直到我泪流满面地放弃之后,我终于找到了这个filecontents环境,它几乎可以独自解决我的问题!

问题

问题是,当filecontent通过 重新引入 ed 代码时\input,LaTeX 会在末尾添加一个隐式换行符,这会转换为空格,而我似乎无法摆脱它。

我看到过很多半相关的问题,答案采用了如下技巧:

  • 逐行读取文件,
  • \everyeof一些巧妙的方法,
  • \endlinechar
  • 使用如下软件包catchfile

但它们都没有对以下问题提供明确的答案:

问题

怎样才能获得\input文件而不获得隐式换行符?

最小工作示例

\documentclass[margin=1mm]{standalone}

\usepackage{filecontents}

\begin{filecontents*}{tmp.tex}
    \LaTeX{}\end{filecontents*}

\begin{document}
    \fbox{\input{tmp.tex}}
\end{document}

在此处输入图片描述

请注意框右侧的额外空格。

还请注意,我绝对没有添加任何显式空格。即使是手动生成的文件(因此,不使用filecontents)完全没有换行符也会出现同样的问题。

答案1

下面需要不同的命令,例如\minput

\documentclass[margin=1mm,varwidth]{standalone}

\usepackage{filecontents}

\newcommand\minput[1]{%
  \input{#1}%
  \ifhmode\ifnum\lastnodetype=11 \unskip\fi\fi}

\begin{filecontents*}{tmp.tex}
\LaTeX{}
\end{filecontents*}
\begin{filecontents*}{tmp2.tex}
\LaTeX
\end{filecontents*}
\begin{filecontents*}{tmp3.tex}
\LaTeX\hspace{2em}
\end{filecontents*}

\begin{document}
\fbox{\input{tmp.tex}} \fbox{\minput{tmp.tex}}

\minput{tmp}Nospace \minput{tmp} Space

\minput{tmp2} Space

\minput{tmp3}Nospace

\LaTeX\hspace{2em}Nospace
\end{document}

如果输入文件以类似的内容结尾,此操作将会失败\hskip 2pt,但我相信可以忽略这种情况。

在此处输入图片描述

答案2

尝试将 添加\endinput为文件的最后一行\input。这将导致忽略后面的所有内容。事实上,您可以在后面添加任何您想要的内容\endinput,这对于包含您自己的注释很有用。

用 来结束文件的最后一行“真实”行可能也是一个好主意,这样%甚至可以避免使用换行符。

\endinput是 tex 原语,并且通常不会在 latex 手册中提及。

答案3

\input通过直接遵循指令,我已经能够获得令人满意的行为\unskip

一个最小的工作示例:

\documentclass[margin=1mm]{standalone}

\usepackage{filecontents}

\begin{filecontents}{tmp.tex}
    \LaTeX{}
\end{filecontents}

\begin{document}
    \fbox{\input{tmp.tex}}
    \fbox{\input{tmp.tex}\unskip}
\end{document}

在此处输入图片描述

这不是问题的有效答案,因为我现在不再可以选择在末尾添加空格如果我想. 但总比没有好。

答案4

你的问题不是末尾隐含的换行符,而是明确的换行符。例如:

\documentclass{article}
\usepackage{filecontents}
  \begin{filecontents*}{file.tex}
    xyz%
  \end{filecontents*}
  \begin{filecontents*}{file2.tex}
    xyz
  \end{filecontents*}
\begin{document}
  \fbox{\input{file.tex}}
  \fbox{\input{file2.tex}}
\end{document}

第一个没有空间,第二个有。

另外,请注意filecontents包,它使在此环境中使用和重复使用文档更加方便。

相关内容