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

时间:2010-04-28 23:24:03

标签: latex

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

\begin{dialogue}{Johnny} Some dialogue. \end{dialogue}
\begin{dialogue}{Jane} I see. \end{dialogue}

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

的内容
\dialogue{Johnny} Some dialogue.
\dialogue{Jane} I see.

代替?

3 个答案:

答案 0 :(得分: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}}

此代码必须为\makeatletter-protected - 由\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.

一切都应该有效。

答案 1 :(得分:8)

试试这个:

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

% Usage example:
\dialogueline{Johnny}{Some dialogue.}  
\dialogueline{Jane}{I see.}  

答案 2 :(得分:3)

如果你假设每个对话框占用一个段落(通常,它以双行段落开头和结尾),那么还有另一种方法让\dialogue只占一个参数:

\newif\indialog \indialogfalse
\def\dialogue#1{\ifindialog \end{dialogue}#1\begin{dialog}\else 
                \everypar={\end{dialogue}\indialogfalse \everypar={}}#1\indialogtrue\begin{dialogue} 
                \fi}

该代码有点脏和非Latexy -it设置\everypar而不关心其现有内容 - 而Latex有更清晰的抽象来做,我已经忘记了,但原则应该是明确的。< / p>

相关问题