介绍
我正在开发一个轻量级包,它允许您将任何内容(通常是 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
包,它使在此环境中使用和重复使用文档更加方便。