gb4e 中用于简单说话人标签的自定义 \xlist 环境

gb4e 中用于简单说话人标签的自定义 \xlist 环境

这是我第一次向 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}

代码输出

相关内容