为什么我能够 \include 到序言中?

为什么我能够 \include 到序言中?

答案是何时应使用 \input 和 \include?提及:

\include可以为您带来速度奖励,但它也不能嵌套,不能出现在序言中,并且强制在包含的文本周围分页。

但我写过一个似乎与此相矛盾的例子。

foo.tex

\documentclass{article}
\include{bar}
\begin{document}
\maketitle
Foo
\end{document}

巴氏

\title{Bar}

我可以foo.tex成功编译,并且当我使用 PDF 阅读器查看生成的 PDF 时,我还可以看到标题。

$ 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))
\@input{bar.aux}
(./bar.tex)
No file foo.aux.

LaTeX Warning: No \author given.

[1{/var/lib/texmf/fonts/map/pdftex/updmap/pdftex.map}] (./foo.aux) )</usr/share
/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmr10.pfb></usr/share/texliv
e/texmf-dist/fonts/type1/public/amsfonts/cm/cmr12.pfb></usr/share/texlive/texmf
-dist/fonts/type1/public/amsfonts/cm/cmr17.pfb>
Output written on foo.pdf (1 page, 24969 bytes).
Transcript written on foo.log.

\include当我所链接的答案说这是不可能的时,为什么我却能在序言中做到这一点?

答案1

\include命令在开始时使用\clearpage,但是到目前为止序言中还没有构建页面,因此没有效果。

这是文件中的一些代码latex.ltx(缩短了!)

\def\include#1{\relax
  \ifnum\@auxout=\@partaux
    \@latex@error{\string\include\space cannot be nested}\@eha
  \else \@include#1 \fi}
\def\@include#1 {%
  \clearpage
%.... much more ...
}

由于\title{foo}仅定义(最好设置)另一个宏,因此用于的文件中没有排版内容\include

这个小文档实际上做了同样的事情:

\documentclass{article}
\title{foo}
\clearpage% Does nothing here
\begin{document}
\clearpage% Does nothing here, since there is no page yet!
\maketitle
Foo
\end{document}

但一旦排版发生(即构成页面的内容),操作\include必定在序言中失败,就好像你直接在序言中写了内容一样。

\include所以,根本不要在序言中使用。

当然,在另一个文件中排版代码并\input在序言中使用该文件时,错误将是相同的!

答案2

有许多不正确的乳胶输入结构实际上并不会产生错误,它们只是偶然和运气好才会产生错误。\include只有在序言之后使用才会产生有用的效果,如果在序言之前使用,它可能像一个低效的版本一样工作,\input并且您设法避免出现错误,但在这种情况下,行为的任何部分都不是设计的,它只是意外扩展了错误输入。

例如

\@input{bar.aux} 

在您显示的输出中,正在写入控制台,该输出旨在写入主aux文件,但由于辅助文件直到才打开,因此无法写入\begin{document}。碰巧的是,在 tex 中写入未打开的流并不是错误,它只是写入控制台,但在这里除了名称之外,在其他所有情况下都是错误。

相关内容