获取两个命令之间的标记

获取两个命令之间的标记

我正在尝试创建一个screenplay使用非常简单的语法来创建对话的类,将其转储为纯文本文件以用于字幕。为了划分字幕部分&,我使用^设置新的扬声器,如下所示:

\documentclass{article}
\catcode`\^=13
\def^#1: {\par \textbf{#1:}}
\catcode`\&=13
\def&{\par \hspace{10pt}}
\begin{document}
 ^Alice: &Hello Bob. &What's up?
 ^Bob: &Nothing, really. &Goodbye.
\end{document}

现在我想获取介于 之间的文本&...&(即从&到 紧接着下一个 之前的文本&,因此&a&b&c应扩展为\foo{a}\foo{b}\foo{c}),以便将其与运行索引一起保存到我的文本文件中。因此我尝试了\bgroup/egroup如下:

\documentclass{article}
\usepackage{color}
\def\testcommand{\textcolor{blue}}
\catcode`\^=13
\def^#1: {\egroup \par \textbf{#1:} \bgroup}
\catcode`\&=13
\def&{\egroup \par \hspace{10pt} \testcommand\bgroup}
\begin{document}
 \bgroup
 ^Alice: &Hello Bob. &What's up?
 ^Bob: &Nothing, really. &Goodbye.
 \egroup
\end{document}

而且它似乎有效,因为它\textcolor不只是为下一个字母着色,而是为整行着色,但是当我使用\def\testcommand#1{(#1)}它时,它会用一个空参数调用(产生()你好,鲍勃。()什么……)。

我猜这与我使用\begingroup/时的情况有关\endgroup我的 \testcommand没什么改变,只是\textcolor打破了Extra }, or forgotten \endgroup第一点&

color.sty他们使用了我\def\textcolor#1#从未见过的(当我将它与我的一起使用时,testcommand它会中断\begin{document} ended by \end{)}。那是什么魔力?很难用谷歌搜索……

我的其他尝试\def&#1&{ \testcommand{#1} }也不起作用,因为它吃掉了下一个&......(是否存在某种前瞻?所以我可以使用\def&和吃掉代币直到下一个&^?)

任何指点都值得赞赏!

答案1

你的帖子不知怎么地出现了too many questions溢出错误。让我试着回答一下:你不能使用 将参数传递给宏\testcommand\bgroup <argument>\egroup。这只会传递\bgroup给你的\testcommand

是的,您的定义\def&#1&{ \testcommand{#1} }确实如此:它查找符号之间的文本&,并将&<some text>&其替换为 \testcommand{#1}。也许您正在寻找类似这样的东西:

\documentclass{article}
\def\testcommand#1{(#1)}
\catcode`\^=13
\def^#1: {\par \textbf{#1:}}
\catcode`\&=13
\def&#1&{\ifx\relax#1\relax\else
         \par \hspace{10pt} \testcommand{#1} \expandafter&\fi}
\begin{document}
 ^Alice: &Hello Bob. &What's up?
 ^Bob: &Nothing, really. &Goodbye. &&
\end{document}

请注意,我用来&&表示脚本的结束。

至于你的问题\def\textcolor#1#,这将创建\textcolor一个接受一个参数的宏界定为 {. 因为定义是

\def\textcolor#1#{\@textcolor{#1}}

这意味着您可以使用\textcolor<color-model>{...,这将扩展为\@textcolor{<color-model>}{...。请注意,<color-model>作为可选参数,不能包含{

答案2

这对我有用:

\documentclass{article}
\catcode`\^=13
\catcode`\&=13
\def^#1: #2\\{\par \textbf{#1:} #2 &&}
\def\testcommand#1{(#1)}
\def&#1&{%
  \ifx\relax#1\else%
    \par\hspace{10pt}%
    \testcommand{#1}%
    \expandafter&%
  \fi%
}

\begin{document}
 ^Alice: &Hello Bob. &What's up?\\
 ^Bob: &Nothing, really. &Goodbye.\\
\end{document}

相关内容