我想解决 Donald E. Knuth 的 TeXBook 中的练习 5.7。
Define control sequences **\beginthe**<block name> and **\endthe**<block name>
that provide a “named” block structure.
In other words,
**\beginthe{beguine}\beginthe{waltz}\endthe{waltz}\endthe{beguine}**
should be permissible, but not
**\beginthe{beguine}\beginthe{waltz}\endthe{beguine}\endthe{waltz}.**
- 我怎样才能创建自己的 csname \beginthe?
我已经尝试过这个并且它有效:
\def\beguine#1{\csname beginbeguine \endcsname}
\begin{beguine} 你好,世界! \end{beguine}
这使
ello World!
然而,这并不管用
\def\beguine#1{\csname beginthebeguine \endcsname}
\beginthe{beguine} 你好,世界! \endthe{beguine}
- 我如何制作\开始{华尔兹}...\结束{华尔兹}嵌套在\开始{贝吉恩}...\结束{贝吉恩}环境?
答案1
你说
我已经尝试过这个并且有效:
\def\beguine#1{\csname beginbeguine \endcsname} \begin{beguine} Hello world! \end{beguine}
\begin
但它应该给出未定义的错误。不要使用 latex 测试纯 tex 代码,许多命令有不同的定义,即使它们有相同的名称。
TeX Book给出了答案:
\def\beginthe#1{\begingroup\def\blockname{#1}}
\def\endthe#1{\def\test{#1}%
\ifx\test\blockname
\endgroup
\else
\errmessage{You should have said \string\endthe{\blockname}}%
\fi}
注意,Knuth 的答案在这里仅提供命名组,与 LaTeX 不同,\begin
它不用于\csname
将特定代码附加到组的开始和结束。