我有兩個文件。基本上,主文件只是加載環境包並輸入輔助文件。輔助檔案建立一個基本上不執行任何操作的環境,並建立該環境的一個實例:
主.tex:
\documentclass{scrartcl}
\usepackage{environ}
\begin{document}
\input{secondary.tex}
\end{document}
secondary.tex:
\NewEnviron{myenv}{\BODY}
\begingroup
\myenv
Hello
\endmyenv
\endgroup
我收到以下錯誤訊息:
Runaway argument?
Hello \endmyenv \endgroup \par
! File ended while scanning use of \document.
<inserted text>
\par
l.5 \input{secondary.tex}
當我進行以下任何(!)更改時,該範例將按預期工作:
- 使用
\newenvironment
而不是\NewEnviron
- 使用
\begin{myenv}...\end{myenv}
而不是\begingroup\myenv...\endmyenv\endgroup
- 將 secondary.tex 的內容直接放在 main.tex 中,而不是輸入 secondary.tex
為什麼這不起作用?
答案1
environ
建立一個環境,該環境在定義中使用 TeX 參數文字來捕獲環境內容。此參數文字樣式定義允許套件捕獲環境內容,但它也需要非常嚴格地使用巨集/定義...使用命令樣式環境時您不遵守的東西(\myenv
...\endmyenv
而不是比\begin{myenv}
... \end{myenv}
)。
從廣義上講,\NewEnviron{myenv}
建立一個指定環境開始的宏\myenv
,而該宏正在尋找確切地 \end{myenv}
... 沒有其他的。
該範例在使用時失敗,\input
因為沒有明確的 \end{<something>}
那\myenv
是在尋找。secondary.tex
在找到任何與 的相似之處之前,它就到達了 的結尾\end
。它實際上是在尋找\end{document}
(見下文)。
讓我們看看您提到的三個糾正問題的實例,看看為什麼會發生這種情況:
使用
\newenvironment
而不是\NewEnviron
這樣做的原因應該很明顯。
\newenvironment{myenv}
定義了\myenv
和\endmyenv
,因此使用環境的命令定義應該沒有問題;使用
\begin{myenv}...\end{myenv}
而不是\begingroup\myenv...\endmyenv\endgroup
這正是
environ
您在使用 定義環境時應該使用的內容\NewEnviron
。所以,這是開箱即用的,因為你已經明確地使用環境終止\end{myenv}
;secondary.tex
直接將內容放入main.tex
而不是輸入secondary.tex
由於您使用的是環境的命令形式,因此「目前環境」(LaTeX 稱為
\@currenvir
)永遠不會真正改變。也就是說,它仍然處於document
環境內部(由於呼叫\begin{document}
)。因此,您的環境結束捕獲實際上是\end{document}
根據newenviron
的設定進行的。你的環境「開始」於\myenv
並結束於\end{document}
。很奇怪,但這就是當您不使用預期的環境範圍時它的工作原理\begin{...}
...。\end{...}
為了讓它在上下文中正常工作,newenviron
請使用範圍\begin{myenv}
...。此範圍界定提供了您透過...\end{myenv}
實施的必要分組。\begingroup
\endgroup
或者,定義\myenv
捕獲內容直到到達\endmyenv
:
\documentclass{scrartcl}
\usepackage{filecontents}
\begin{filecontents*}{secondary.tex}
\long\def\myenv #1\endmyenv{#1}% Fake myenv environment that captures its body
\begingroup
\myenv
Hello
\endmyenv
\endgroup
\end{filecontents*}
\begin{document}
\input{secondary.tex}
\end{document}
答案2
確實如此不是如果將內容放在主文件中,則可以工作。它只是不給出錯誤。嘗試這個:
\documentclass{scrartcl}
\usepackage{environ}
\begin{document}
\NewEnviron{myenv}{BEGIN\BODY END}
\begingroup
\myenv
Hello
\endmyenv
\endgroup
World
\end{document}
Environ 需要找到 \end{myenv} 來停止解析。