这是我第一次向 tex stack exchange 发帖,因此如果帖子缺少所需信息,我深表歉意。
我正在使用 gb4e 为我的论文制作语言示例,并试图找到将说话者标签作为示例编号的一部分的最便捷方法。我见过的一些问题(例如带有重叠、行号和说话者标签的行间注释) 建议使用不同的包来执行此操作可能会更容易,但由于我已经在 gb4e 中编写了几百个示例,因此坚持使用 gb4e 可以节省我的时间,因为只有少数需要说话人标签。
以下是基本考虑因素:
- 每个例子中最多需要区分三位说话者
- 发言者标签只是 A/B/C(或类似)标识符,因为我不需要引用发言者的全名
- 所有子示例均需要完整的行间注释
当前的方法是将每个话语放在 \xlist 中,并对于每个子示例,将说话者标签放在与示例编号相同的行上,删除 \gll 之前的一些空格:
\newcommand{\speakerlabel}[1]{Speaker #1\vspace*{-.5\baselineskip}}
\begin{exe}
\ex \begin{xlist}
\ex \label{ex:my example} \speakerlabel{A}
\gll my example\\
my example\\
\trans `My example'
\end{xlist}
\end{exe}
\ref{ex:my example}
这是一个相当整洁的解决方案,但它浪费了单字符说话者标识符的空间,并且说话者标识符不会保留在示例编号中以供交叉引用(请注意文本引用示例 171a,而不是 171a-A)。如果说话者的身份可以从示例编号中清楚地看出,那么对我来说会很有用,这样可以避免诸如“说话者 A 用 171a 回答”之类的废话。
理想情况下,我想要的是类似自定义 \xlist 环境的东西,它将说话者标识符添加到示例编号(171a-A、171b-A、171c-B)。\exi{speaker label} 对此不起作用,因为(从我目前所读的内容来看)自定义标识符不适用于交叉引用,因为在计数器中包含任意字符存在问题。但如上所述,一次最多有 3 个独特的说话者,因此一组有限的说话者字符可能不被视为任意的。
我欢迎大家提出其他方式来称呼演讲者的建议,非常感谢大家的回复。提前致谢!
下面的代码给出了我希望它如何工作的想法。是否可以定义 myxlist 和 \exa、\exb 等,以便此代码片段生成一个格式化的示例,该示例在交叉引用中保留说话者标识符,类似于下面的屏幕截图?
(请注意,我还会将说话人标识符更改为 A/B/C 以外的其他内容,以免与子示例编号混淆,但这足以解释)
\begin{exe}
\ex \label{ex:some dialogue} \begin{myxlist}
\exa \gll first utterance\\
first utterance\\
\trans `First utterance'
\exb \label{ex:B's reply} \gll second utterance\\
second utterance\\
\trans `Second utterance'
\exb \gll third utterance\\
third utterance\\
\trans `Third utterance'
\end{myxlist} \end{exe}
Reference to \ref{ex:B's reply}.
答案1
我不确定这是最好的系统,因为说话者标签独立于示例参考,并且在其中不会发生变化,但这里有一个简单的系统可以实现您想要的。
它将现有\xlistA
列表重新定义gb4e
为带有说话者后缀的常规字母列表。说话者后缀使用\spkr
宏设置。您应该使用固定长度的说话者标签,因为标签本身在列表中是右对齐的,因此使用可变宽度的说话者标签会创建一个奇怪的列表,因为示例字母不会在左侧对齐。
该列表默认为第一个发言者;如果后续示例中的发言者标签没有改变,则A
无需对每个示例都使用。\spkr
\documentclass{article}
\usepackage{enumitem}
\usepackage{gb4e}
\makeatletter
\newcommand*{\@spkr}{}
\newcommand*{\spkr}[1]{\renewcommand\@spkr{#1}}
% This redefines the xlistA list to use a speaker suffix
% The width of the label is determined by the [m-M.] part
% Since the label is right aligned, you need to make sure
% that the speaker labels are of uniform length.
\renewcommand{\xlistA}
{\renewcommand\thexnumii{\@xsii{xnumii}-\@spkr}
\spkr{A}
\@ifnextchar [{\@xlist{\alph}}{\@xlist{\alph}[m-M.]}}
\makeatother
\begin{document}
\begin{exe}
\ex\label{mydiscourse}
\begin{xlistA}
\ex\gll This is a glossed example\\
These are the gloss words\\
\glt `This is a translation' \label{LabelA}
\spkr{B}\ex \gll This is a glossed example\\
These are the gloss words\\
\glt `This is a translation' \label{LabelB}
\spkr{A}\ex\gll This is a glossed example\\
These are the gloss words\\
\glt `This is a translation'
\end{xlistA}
\end{exe}
As we can see in (\ref{LabelA}) and (\ref{LabelB}) we get proper cross-referencing.
\begin{exe}
\ex\label{myregexample}
\begin{xlist}[foo]
\ex\gll This is a glossed example\\
These are the gloss words\\
\glt `This is a translation' \label{LabelC}
\ex \gll This is a glossed example\\
These are the gloss words\\
\glt `This is a translation' \label{LabelD}
\ex\gll This is a glossed example\\
These are the gloss words\\
\glt `This is a translation'
\end{xlist}
\end{exe}
Regular lists are unaffected as in (\ref{LabelC}) and (\ref{LabelD}).
\end{document}