要使用screenplay
包输入一些对话,我必须使用
\begin{dialogue}{Johnny} Some dialogue. \end{dialogue}
\begin{dialogue}{Jane} I see. \end{dialogue}
一段时间后,它变得有点乏味。是否可以指定自定义命令,以便我可以使用类似
的内容\dialogue{Johnny} Some dialogue.
\dialogue{Jane} I see.
代替?
答案 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>