TeX 练习 5.7 - 用分组定义控制序列

TeX 练习 5.7 - 用分组定义控制序列

我想解决 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}.**
  1. 我怎样才能创建自己的 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. 我如何制作\开始{华尔兹}...\结束{华尔兹}嵌套在\开始{贝吉恩}...\结束{贝吉恩}环境?

答案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将特定代码附加到组的开始和结束。

相关内容