MWE 1(无错误)

MWE 1(无错误)

\Subentry例如,在 LaTeX3 环境之外定义命令时,命令可以正常工作{mainentry},但只要有人想将其定义放在(定义)提到环境未定义控制序列- 产生了上述命令的错误,这意味着 LaTeX 无法读取其定义。

微波能量吸收 1,没有产生任何错误,显然是因为包含 \Subentry 命令的行,即以下几行:

\def\Subentry{\def\SubentryS{\def\SubentryS{ \endgraf }}\futurelet\next\SubentryA}
\def\SubentryA{\ifx\bgroup\next\expandafter\SubentryB\fi}
\def\SubentryB#1#2{\SubentryS { #1 #2 {\bfseries #1} } \futurelet\next\SubentryA}

是在环境之外定义的{mainentry}

  • 微波能量吸收 1,没有Undefined control sequence产生。
  • 微波辐射计 2,这些行将被放置在环境内部,位于内部{mainentry}的位置% ???微波能量吸收 1。我们还将命令的发布放在\Subentry{C}{D}环境的发布中。然后,我们将命令的定义移到环境的开头,而不是放在结尾(在用户 Wipet 的评论)。

MWE 1(无错误)

% !TEX TS-program = lualatexmk

\documentclass[a4paper]{scrreprt}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Declare packages and commands
%
\usepackage{xparse}
\ExplSyntaxOn
\cs_set_eq:NN
\IfEmptyTF
\tl_if_blank:nTF
\ExplSyntaxOff
%
\NewDocumentEnvironment {mainentry} { m m m } {%
% ???
  \IfEmptyTF{#3}{%
#1 #2
  }{%
#1 #2 \endgraf #3
  }
  }{%
}
%
%
%
\def\Subentry{\def\SubentryS{\def\SubentryS{ \endgraf }}\futurelet\next\SubentryA}
\def\SubentryA{\ifx\bgroup\next\expandafter\SubentryB\fi}
\def\SubentryB#1#2{\SubentryS { #1 #2 {\bfseries #1} } \futurelet\next\SubentryA}
%
%
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\begin{document}

\begin{mainentry}{A}{B}{}
\end{mainentry}

Some text.

\Subentry{C}{D}

\end{document}

MWE 2(错误)

请注意,我想把(定义)命令\Subentry内部(定义)环境,{mainentry}因为我希望{\textbf #1}(发生在该命令内部)被替换为{\textbf ##1}(或任何必要的代码......我不知道具体要使用什么语法),以便它实际上接受环境的第一个参数(所以{mainentry})它被放置在(谈论定义),而不仅仅是命令自己的第一个参数。

{\textbf #1}目前,产量的实例C(在 casu 中,它所在的命令的第一个参数),而我希望它产生A(包含环境的第一个参数,层次结构的上一级,该命令可能发现自己)(谈论定义)

因此,微波辐射计 2使用{\textbf ##1}代替{\textbf #1}。 (以下用户 David Carlisle 的评论)。---> 请注意,我误解了这条评论... OP 在进一步理解后指出... ## 1 实际上是指内部参数,而不是外部参数 <---

错误看起来如下:

./test.tex:69: \SubentryB 的使用与其定义不符。

% !TEX TS-program = lualatexmk

\documentclass[a4paper]{scrreprt}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Declare packages and commands
%
\usepackage{xparse}
\ExplSyntaxOn
\cs_set_eq:NN
\IfEmptyTF
\tl_if_blank:nTF
\ExplSyntaxOff
%
\NewDocumentEnvironment {mainentry} { m m m } {%

\def\Subentry{\def\SubentryS{\def\SubentryS{ \endgraf }}\futurelet\next\SubentryA}
\def\SubentryA{\ifx\bgroup\next\expandafter\SubentryB\fi}
\def\SubentryB#1#2##1{\SubentryS { #1 #2 {\bfseries ##1} } \futurelet\next\SubentryA}

  \IfEmptyTF{#3}{%
#1 #2
  }{%
#1 #2 \endgraf #3
  }
  }{%

}
%
%
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\begin{document}

\begin{mainentry}{A}{B}{}

\Subentry{C}{D}

\end{mainentry}

Some text.

\end{document}

答案1

您可以实验并思考以下代码:

\documentclass[a4paper]{scrreprt}

\newenvironment {mainentry} {\mainentryA}{}
\def\mainentryA#1#2#3{%
   \def\SubentryC##1##2{%
      Here is external parameter (#1) and second external (#2).
      And internal parameter is (##1) and second internal (##2).
   }%
   \ifx\mainentryA#3\mainentryA  % if #3 is empty
   #1 #2
   \else
   #1 #2\endgraf #3
   \fi
}
\def\Subentry{\def\SubentryS{\def\SubentryS{\endgraf}}\futurelet\next\SubentryA}
\def\SubentryA{\ifx\bgroup\next\expandafter\SubentryB\fi}
\def\SubentryB#1#2{\SubentryS\SubentryC{#1}{#2}\futurelet\next\SubentryA}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\begin{document}
\begin{mainentry}{A}{B}{}
\Subentry{C}{D}{E}{F}
NEXT
\Subentry{U}{V}{W}{X}{Y}{Z}
\end{mainentry}
Some text.
\end{document}

您可以使用 LaTeX 并查看输出。该代码源自您的代码,但我没有使用冗余包(特别是,我没有使用任何包)和冗余代码,以便只关注您的问题。

答案2

你得到的错误(至少从最后一个例子来看)不是“未定义的控制序列”,而是“使用\SubentryB不符合其定义”。事实上你确实

\def\SubentryB#1#2##1{\SubentryS { #1 #2 \href{http://a.beautiful.url/?q=\percentifier{##1}}{test-link} } \futurelet\next\SubentryA}

定义\SubentryB要求后面跟着当前mainentry环境的前两个参数。你可能想说的是

\def\SubentryB##1##2{\SubentryS { ##1 ##2 \href{http://a.beautiful.url/?q=\percentifier{##1}}{test-link} } \futurelet\next\SubentryA}

但根据你的例子很难猜测。在你的情况下,你正在做

\def\SubentryB AB#1{\SubentryS { A B \href{http://a.beautiful.url/?q=\percentifier{#1}}{test-link} } \futurelet\next\SubentryA}

因为 TeX在定义时会将参数替换为实参,然后变成##。所以你明白为什么#\SubentryB 紧接着AB,但它的调用都不是。

相关内容