为什么 \include 和 \input 处理扩展名的方式不同?

为什么 \include 和 \input 处理扩展名的方式不同?

我有一个文件bar.tex,它包含在其他文件中。

$ cat bar.tex
hello, world
$ cat foo.tex
\documentclass{article}
\begin{document}
\include{bar.tex}
\end{document}
$ pdflatex foo.tex
This is pdfTeX, Version 3.14159265-2.6-1.40.15 (TeX Live 2015/dev/Debian) (preloaded format=pdflatex)
 restricted \write18 enabled.
entering extended mode
(./foo.tex
LaTeX2e <2014/05/01>
Babel <3.9l> and hyphenation patterns for 2 languages loaded.
(/usr/share/texlive/texmf-dist/tex/latex/base/article.cls
Document Class: article 2014/09/29 v1.4h Standard LaTeX document class
(/usr/share/texlive/texmf-dist/tex/latex/base/size10.clo)) (./foo.aux
(./bar.tex.aux))
No file bar.tex.tex.
(./foo.aux (./bar.tex.aux)) )
No pages of output.
Transcript written on foo.log.

您可以在上面看到,pdflatex 无法包含该文件,因为No file bar.tex.tex。它正在寻找bar.tex.tex而不是 bar.tex

当然,下面的方法可以正常工作。

$ cat foo2.tex 
\documentclass{article}
\begin{document}
\include{bar}
\end{document}
$ pdflatex foo2.tex
This is pdfTeX, Version 3.14159265-2.6-1.40.15 (TeX Live 2015/dev/Debian) (preloaded format=pdflatex)
 restricted \write18 enabled.
entering extended mode
(./foo2.tex
LaTeX2e <2014/05/01>
Babel <3.9l> and hyphenation patterns for 2 languages loaded.
(/usr/share/texlive/texmf-dist/tex/latex/base/article.cls
Document Class: article 2014/09/29 v1.4h Standard LaTeX document class
(/usr/share/texlive/texmf-dist/tex/latex/base/size10.clo))
No file foo2.aux.
(./bar.tex) [1{/var/lib/texmf/fonts/map/pdftex/updmap/pdftex.map}] (./foo2.aux
(./bar.aux)) )</usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmr
10.pfb>
Output written on foo2.pdf (1 page, 11574 bytes).

但当我\input同时使用\include两者时bar.texbar 似乎有效。

$ cat foo3.tex 
\documentclass{article}
\begin{document}
\input{bar.tex}
\end{document}
$ pdflatex foo3.tex
This is pdfTeX, Version 3.14159265-2.6-1.40.15 (TeX Live 2015/dev/Debian) (preloaded format=pdflatex)
 restricted \write18 enabled.
entering extended mode
(./foo3.tex
LaTeX2e <2014/05/01>
Babel <3.9l> and hyphenation patterns for 2 languages loaded.
(/usr/share/texlive/texmf-dist/tex/latex/base/article.cls
Document Class: article 2014/09/29 v1.4h Standard LaTeX document class
(/usr/share/texlive/texmf-dist/tex/latex/base/size10.clo))
No file foo3.aux.
(./bar.tex) [1{/var/lib/texmf/fonts/map/pdftex/updmap/pdftex.map}] (./foo3.aux)
 )</usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmr10.pfb>
Output written on foo3.pdf (1 page, 11574 bytes).
Transcript written on foo3.log.
$ cat foo4.tex
\documentclass{article}
\begin{document}
\input{bar}
\end{document}
$ pdflatex foo4.tex
This is pdfTeX, Version 3.14159265-2.6-1.40.15 (TeX Live 2015/dev/Debian) (preloaded format=pdflatex)
 restricted \write18 enabled.
entering extended mode
(./foo4.tex
LaTeX2e <2014/05/01>
Babel <3.9l> and hyphenation patterns for 2 languages loaded.
(/usr/share/texlive/texmf-dist/tex/latex/base/article.cls
Document Class: article 2014/09/29 v1.4h Standard LaTeX document class
(/usr/share/texlive/texmf-dist/tex/latex/base/size10.clo))
No file foo4.aux.
(./bar.tex) [1{/var/lib/texmf/fonts/map/pdftex/updmap/pdftex.map}] (./foo4.aux)
 )</usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmr10.pfb>
Output written on foo4.pdf (1 page, 11574 bytes).
Transcript written on foo4.log.

\include为什么和之间存在这种不一致\input,即为什么\include要求包含的文件不带扩展名而\input并不关心是否指定扩展名?

答案1

不存在不一致。该\include命令应该有一个文件名作为参数没有扩展;这是记录的行为,并且是要求

该命令仅用于输入.tex文件,以便通过对材料进行“选择性处理” \includeonly

另一方面,\input可以用于任何.tex这类文件(甚至是二进制文件,如果你足够大胆的话),只要它们有一个扩展名,因为 TeX 的默认设置是在缺少扩展名时添加(某些实现除外)。

因此,这两个命令彼此之间有很大不同,并且不能互换。最终,\include使用\input,但这不是用户应该关心的事情。

答案2

线索就在您显示的终端输出中。

(./bar.tex.aux)

\include需要构造一个文件的名称aux,并且在 tex 中如果用户请求foo您无法判断实际的文件输入是否foo如此foo.tex,那么最可靠的方法(如果您有可靠的用户)是记录该文件应该始终有一个扩展名,并且参数\include不应该提及扩展名。然后#1.tex是文档文件,#1.aux是辅助文件。

相关内容