我想在我最近的文档类中创建一组命令jwjournal
用于暂时关闭和打开语法。但是,当尝试使用命令结束和启动主环境时,会出现此错误:
\begin{jwjournal} on input line 11 ended by \end{{}.
下面是一个 MWE。据我所知,\JournalSyntaxOn
应该等同于,\begin{jwjournal}
并且对于 也类似\JournalSyntaxOff
,但这里显然不是这样。下面的定义是否有可能以某种方式得到修复?
\documentclass{jwjournal}
\def\JournalSyntaxOn{\begin{jwjournal}}
\def\JournalSyntaxOff{\end{jwjournal}}
\begin{document}
\end{jwjournal} \verb|test| \begin{jwjournal} % Works
\JournalSyntaxOff \verb|test| \JournalSyntaxOn % Error
\end{document}
答案1
你可能没有采取正确的方法:也许你不需要定义一组两个命令,但是环境begin{jwjournalsynt}
;类似于\end{jwjournalsynt}
。第 3.4 节旧用户指南告诉你如何做到这一点:
\newenvironment {⟨cmd⟩} [⟨num⟩] [⟨default⟩] {⟨beg-def ⟩} {⟨end-def ⟩}
\newenvironment* {⟨cmd⟩} [⟨num⟩] [⟨default⟩] {⟨beg-def ⟩} {⟨end-def ⟩}
\renewenvironment {⟨cmd⟩} [⟨num⟩] [⟨default⟩] {⟨beg-def ⟩} {⟨end-def ⟩}
\renewenvironment* {⟨cmd⟩} [⟨num⟩] [⟨default⟩] {⟨beg-def ⟩} {⟨end-def ⟩}
现在,以及第 2.4 节新用户指南告诉你
\NewDocumentEnvironment {⟨env⟩} {⟨arg spec⟩} {⟨beg-code⟩} {⟨end-code⟩}
\RenewDocumentEnvironment {⟨env⟩} {⟨arg spec⟩} {⟨beg-code⟩} {⟨end-code⟩}
\ProvideDocumentEnvironment {⟨env⟩} {⟨arg spec⟩} {⟨beg-code⟩} {⟨end-code⟩}
\DeclareDocumentEnvironment {⟨env⟩} {⟨arg spec⟩} {⟨beg-code⟩} {⟨end-code⟩}
@ulrike 在评论中明确指出,你正在尝试定义一个新的环境,在我看来这对您来说仍然不清楚;而且您正在处理一个特殊情况。
While environments \begin{⟨environment⟩} . . . \end{⟨environment⟩} are typically used in cases where the code implementing the ⟨environment⟩ does not
need to access the contents of the environment (its ‘body’), it is sometimes
useful to have the body as a standard argument.
This is achieved by ending the argument specification with b, which is a dedicated argument type for this situation. For instance
\NewDocumentEnvironment{twice} {O{\ttfamily} +b}
{#2#1#2} {}
\begin{twice}[\itshape]
Hello world!
\end{twice}
\__cmd_declare_env:nnnn
您可以通过在 LaTeX 源中搜索来检查内部如何完成此操作(使用 LaTeX3 语法) 。
无论如何,这是一个 LaTeX3 的问题,而不是一个“核心”问题。
答案2
主要问题是“jwjournal”环境使用xparse 功能来获取和下一个b
之间的环境主体\begin{...}
\end{...}
... 在里面文档文本,而不是在文档文本中的宏的扩展中。
这意味着您的\JournalSyntaxOn
扩展\begin{jwjournal}
将扩展到一些内部 xparse 宏,这些宏会尝试抓取所有内容,直到\end
找到当前环境的某个宏。由于您“隐藏”了宏\end{...}
内部的相应宏,因此找不到任何内容,或者出现错误或文档结尾,扫描过程将停止并显示错误消息。\JournalSyntaxOff
\end
\end
因此,最简单的解决方案是在“jwjournal”和/或“xparse”之上定义一个正常的 LaTeX 环境,这在其他答案和评论中已经提出过。
或者您必须实现自己的扫描和抓取例程来搜索\JournalSyntaxOff
宏标记而不是环境\end{...}
。