“逃跑的爭論?” \NewEnviron 錯誤

“逃跑的爭論?” \NewEnviron 錯誤

我有兩個文件。基本上,主文件只是加載環境包並輸入輔助文件。輔助檔案建立一個基本上不執行任何操作的環境,並建立該環境的一個實例:

主.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} 來停止解析。

相關內容