\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
,但它的调用都不是。