'\ begin {environment} ...\end {environment}'的自定义命令

njt*_*njt 9 latex

要使用screenplay包进入一些对话,我必须使用

\begin{dialogue}{Johnny} Some dialogue. \end{dialogue}
\begin{dialogue}{Jane} I see. \end{dialogue}
Run Code Online (Sandbox Code Playgroud)

一段时间后,它会变得有点乏味.是否可以指定自定义命令,以便我可以使用类似的东西

\dialogue{Johnny} Some dialogue.
\dialogue{Jane} I see.
Run Code Online (Sandbox Code Playgroud)

代替?

Ant*_*sky 12

事实上你可以得到你想要的东西:

\newcommand{\dialogueline}{\begingroup\catcode`\^^M=12 \dialogueline@EOL}
{\catcode`\^^M=12\gdef\dialogueline@EOL#1#2^^M{\begin{dialogue}{#1}#2\end{dialogue}\endgroup}}
Run Code Online (Sandbox Code Playgroud)

这段代码需要被\makeatletter保护 -\makeatletter/ \makeatother(编辑:这意味着你放在\makeatletter定义之前,\makeatother之后)或.sty文件中包围.请注意,名为的环境dialogue定义了一个名为的命令\dialogue,因此您需要一个不同的名称.不要改变格式!

它的工作方式\dialogueline是一个不带参数的命令,而是扩展为多个序列.首先,一个组打开令牌,在其自己的范围内放置任何后续内容.第二,\catcode`^^M=12顺序.LaTeX为每个字母分配一个catcode:一个数字,表示它是什么类型.例如,反斜杠是catcode 0,命令名构造函数; 字母是catcode 11; 和非字母打印字符,例如at符号,是catcode 12.这个序列使^^M换行符具有catcode 12,因此我们可以与它进行交互.最后,我们写出了命令\dialogueline@EOL,它完成了繁重的工作.

接下来,我们定义\dialogueline@EOL.我们在换行符是catcode 12的组中这样做,就像\dialogueline扩展的位置一样.请注意,这就是为什么你不能用换行符破坏第二行 - 它将被解释为文本.接下来,我们定义\dialogueline@EOL采用两个参数,以换行符结束; 它通过获取第一个参数(您在大括号中传递)并将其作为参数传递给dialogue环境进行扩展,并将第二个参数(在第一个之后和行尾之前的所有内容)作为环境体传递.最后,\dialogueline@EOL结束打开的组\dialogueline,以便在其他^^M地方看不到对catcode的更改.鉴于此,你可以写

\dialogueline{Johnny} Some dialogue.
\dialogueline{Jane}   I see.
Run Code Online (Sandbox Code Playgroud)

一切都应该有效.

  • 好吧,实际上当我使用\ makeatother时,我得到了"使用\ dialogueline与其定义不匹配"的错误,但它与\ makeatletter一起工作正常. (2认同)

In *_*ico 8

试试这个:

\newcommand{\dialogueline}[2]{\begin{dialogue}{#1} #2 \end{dialogue}}

% Usage example:
\dialogueline{Johnny}{Some dialogue.}  
\dialogueline{Jane}{I see.}  
Run Code Online (Sandbox Code Playgroud)