我有一个main.tex
文件,其序言中包含以下路径定义
\def\commonpath{C:/Users/Default/Documents/Folder}
这编译得很好。如果我将代码分成几行,如下所示:
\def\commonpath{%
C:/Users/Default/Documents/Folder%
}
一切都编译得很好。
我想要做的是将路径取出放到一个单独的文件中。例如,我想创建一个文件folderpath.tex
并将其放在与相同的目录中main.tex
。folderpath.tex
应该只包含以下行:
C:/Users/Default/Documents/Folder
然后,main.tex
我想得到类似的东西
\def\commonpath{%
\input{folderpath.tex}%
}
但是,当我这样做并尝试编译时,出现错误missing \begin{document}
。
我该如何解决这个问题?我以为该\input{}
命令实际上就是输入文件的内容。
任何帮助,将不胜感激。
答案1
你可以expl3
很容易地使用以下命令来做到这一点:
\ExplSyntaxOn
\file_get:nnN { folderpath.tex } {} \commonpath
\ExplSyntaxOff
答案2
最简单的方法是使用\input{folderpath}
并folderpath.tex
包含\def\commonpath{a/b/c}
如果您的\input
文件包含以下内容a/b/c
,那么您必须小心行尾的空格,以及通常插入到文件末尾、\par
文件挂钩代码中的不可扩展标记。
答案3
\def\commonpath{\input{folderpath}}
不应使用该方法,原因如下:
\input
是 LaTeX 中一个相当复杂的命令;- 原始的
\input
、可用的\@@input
也不是一个简单的命令; - 无论如何,您每次调用时都会访问文件系统
\commonpath
。
为什么\input
在 LaTeX 中很复杂?因为它不仅需要打开文件,还需要读取文件并关闭文件:
该命令的语法已被修改,因此它符合标准语法(而原语
\input
不符合):LaTeX 希望跟踪输入文件;
其他一些细节…
那么为什么不呢\@@input
?这是因为 TeX 对输入文件做了一些处理,例如,它会在行尾添加一个空格(准确地说\endlinechar
,是标准的,通常会转换为空格)。
你可以使用这个catchfile
包并执行
\CatchFileDef\commonpath{folderpath}{}
(不要忘记后面的{}
),或者提及expl3
方式(可能更可取)。这样做可以避免多次访问文件系统。