我正在写一篇语言学论文,需要为一个例子展示替代注释和翻译。我在这里找到了这个例子(使用 gb4e 对齐多种语言的注释) 显示了如何对齐多个注释,但我需要插入翻译行——在我的例子中,替代注释显示了含义的不同可能解释——插入额外的注释\glt
会导致错误。它应该是这样的:
(1) Auto uderzył dziecko
car.nominative hit child.accusative
'The car hit the child.'
car.accusative hit child.nominative
'The child hit the car.'
使用 或 可以实现这样的效果gb4e
吗langsci-gb4e
?我的解决方法是重复编号示例,但我认为它看起来有点愚蠢。
编辑:回复评论——这实际上不是一个需要解决的问题,而是一个操作方法类型的问题。无论如何,我都会添加最小的工作示例,尽管它显示了我目前拥有的代码,而不是生成所需输出的代码
\documentclass{article}
\usepackage{gb4e}
\begin{document}
\begin{exe}
\ex
\begin{xlist}
\ex
\gll Auto uderzył dziecko. \\
car.\textsc{nom} hit.3\textsc{sg} child.\textsc{acc}\\
\glt `The car hit the child.'
\ex
\gll Auto uderzył dziecko. \\
car.\textsc{acc} hit.3\textsc{sg} child.\textsc{nom} \\
\glt `The child hit the car.''
\end{xlist}
\end{exe}
\end{document}
我尝试了以下操作,但没有效果:
\begin{exe}
\ex
\glll Auto uderzył dziecko. \\
car.\textsc{nom} hit.3\textsc{sg} child.\textsc{acc}\\
\glt `The car hit the child.'
car.\textsc{acc} hit.3\textsc{sg} child.\textsc{nom} \\
\glt `The child hit the car.''
\end{exe}
答案1
因此,我将回答我自己的问题。按照此处帖子中接受的答案(使用 gb4e 对齐多种语言的注释),我在我的序言中定义(复制粘贴)了一个\gliv
命令,如下所示,然后将一行注释组合在花括号内以制作一行翻译。
\documentclass{article}
\usepackage{gb4e}
\makeatletter
\newbox\linefour
\newbox\wordfour
\def\gliv% % Introduces 4-line text-and-gloss.
{\begin{flushleft}
\ifx\@gsingle1%
\vskip\baselineskip\def\baselinestretch{1}%
\@selfnt\vskip-\baselineskip\fi%
\bgroup
\foursent
}
\@ifundefined{eachwordfour}{\let\eachwordfour=\rmfamily}{\relax}
\gdef\foursent#1\\ #2\\ #3\\ #4\\{% #1 = first line, #2 = second line, #3 = third, #4 = fourth
\getwords(\lineone,\eachwordone)#1 \\%
\getwords(\linetwo,\eachwordtwo)#2 \\%
\getwords(\linethree,\eachwordthree)#3 \\%
\getwords(\linefour,\eachwordfour)#4 \\%
\loop\lastword{\eachwordone}{\lineone}{\wordone}%
\lastword{\eachwordtwo}{\linetwo}{\wordtwo}%
\lastword{\eachwordthree}{\linethree}{\wordthree}%
\lastword{\eachwordfour}{\linefour}{\wordfour}%
\global\setbox\gline=\hbox{\unhbox\gline
\hskip\glossglue
\vtop{\box\wordone % vtop was vbox
\nointerlineskip
\box\wordtwo
\nointerlineskip
\box\wordthree
\nointerlineskip
\box\wordfour
}%
}%
\testdone
\ifnotdone
\repeat
\egroup % matches \bgroup in \gloss
\gl@stop}
\makeatother
\begin{document}
\begin{exe}
\ex
\gliv Auto uderzył dziecko. \\
car.\textsc{nom} hit.3\textsc{sg} child.\textsc{acc}\\
{`The car hit the child.'} \\
car.\textsc{acc} hit.3\textsc{sg} child.\textsc{nom} \\
{`The child hit the car.'} \\
\end{exe}
\end{document}
这似乎可以解决问题,同时保留我的编号并且不会搞乱文档的其他部分。
答案2
这是可能的。
或多或少是命令的灵活替代品\gl...
。
作为概念证明,使用 expl3 序列作为集合容器和起点,其中:
- 命名空间
- 任意用户选择的行结束标记(例如
*/
) glt
对于任何一行的翻译,都以标记形式拆分- 将词性的样式与数据分开
\mfsloadaseql[gloss]{ex2}{*/}{%
Auto uderzył dziecko.
*/ car.nom hit.3sg child.acc
glt `The car hit the child.'
*/ car.acc hit.3sg child.nom
glt `The child hit the car.'
}
核心MWE
第一个迭代代码。事物的名称可以更改,或包装在 API 后面 - 所有常见事物。
\documentclass{article}
\usepackage{xcolor}
\usepackage{fontspec}
\setmainfont{Noto Serif}
\usepackage{xparse}
%squiggle
\newcommand\squiggle{%
\begin{center}
{\usefont{U}{lasy}{m}{n}\char58\char58\char58\char58\char58\char58\char58\char58\char58}
\end{center}
}
%-------------------------------------------------------------
\ExplSyntaxOn
\cs_generate_variant:Nn
\seq_gset_split:Nnn
{ cno }
\tl_new:N \g_fc_namespace_tl
%------------------
%****************************************************
%* main commands
%****************************************************
\int_new:N \g_gloss_licount_int
\int_new:N \g_gloss_wordcount_int
\int_new:N \g_gloss_wordsonthisline_int
\tl_new:N \g_fc_wnamespace_tl
\tl_new:N \g_fc_mylinenum_tl
\tl_new:N \g_gloss_currentline_tl
\tl_new:N \g_gloss_currentword_tl
%--------------------
\NewDocumentCommand { \mfsloadwords } { o m +m } {
% 1=namespace
% 2=line number
% 3=data
\IfNoValueTF { #1 }
{ \tl_clear:N \g_fc_wnamespace_tl }
{ \tl_gset:Nn \g_fc_wnamespace_tl { #1 } }
\cs_if_free:cT
{ g_fc_line \g_fc_wnamespace_tl #2 _seq }
{ \seq_new:c
{ g_fc_line \g_fc_wnamespace_tl #2 _seq }
}
\seq_gclear:c
{ g_fc_line \g_fc_wnamespace_tl #2 _seq }
\exp_args:Nnnx
\seq_gset_split:cno
{ g_fc_line \g_fc_wnamespace_tl #2 _seq }
{ ~ }
{ #3 }
% \seq_show:c
% { g_fc_line \g_fc_namespace_tl #2 _seq }
\int_gset:Nn
\g_gloss_wordcount_int
{
\seq_count:c
{ g_fc_line \g_fc_wnamespace_tl #2 _seq }
}
%%%=
%% \seq_use:cn
%% { g_fc_line \g_fc_wnamespace_tl #2 _seq }
%% { | }
%%
%% \tex_space:D (
%% \int_use:N
%% \g_gloss_wordcount_int
%% \tex_space:D items for line #2)
}
%--------------------
\tl_new:N \l_tmpc_tl
\tl_new:N \l_tmpd_tl
\tl_new:N \l_texttranslinenum_tl
\tl_new:N \l_texttransline_tl
\int_new:N \l_texttransline_int
\int_new:N \l_texttransloop_int
\NewDocumentCommand { \mfsloadaseql } { o m m +m } {
% 1=namespace
% 2=seq name
% 3=sep
% 4=data
\IfNoValueTF { #1 }
{ \tl_clear:N \g_fc_namespace_tl }
{ \tl_gset:Nn \g_fc_namespace_tl { #1 } }
\cs_if_free:cT
{ g_fc_rwe \g_fc_namespace_tl #2 _seq }
{ \seq_new:c
{ g_fc_rwe \g_fc_namespace_tl #2 _seq }
}
\seq_gclear:c
{ g_fc_rwe \g_fc_namespace_tl #2 _seq }
\seq_gset_split:cno
{ g_fc_rwe \g_fc_namespace_tl #2 _seq }
{ #3 }
{ #4 }
%%=
% \seq_show:c
% { g_fc_rwe \g_fc_namespace_tl #2 _seq }
%-----
\int_gset:Nn
\g_gloss_licount_int
{
\seq_count:c
{ g_fc_rwe \g_fc_namespace_tl #2 _seq }
}
%%%%=
%%% \seq_use:cn
%%% { g_fc_rwe \g_fc_namespace_tl #2 _seq }
%%% { | }
%%%%=
%%% \tex_space:D (
%%% \int_use:N
%%% \g_gloss_licount_int
%%% \tex_space:D items)
% words:
\int_set:Nn
\l_tmpa_int
{ 1 }
\int_do_until:nNnn
{ \l_tmpa_int } > { \g_gloss_licount_int }
{
% xxx
% split out any translation
\tl_set:Nx
\l_texttranslinenum_tl
{ \int_use:N \l_tmpa_int }
\cs_if_free:cT
{ g_fc_texttrans \g_fc_namespace_tl #2\l_texttranslinenum_tl _seq }
{ \seq_new:c
{ g_fc_texttrans \g_fc_namespace_tl #2\l_texttranslinenum_tl _seq }
}
\tl_set:Nx
\l_texttransline_tl
{
\seq_item:cn
{ g_fc_rwe \g_fc_namespace_tl #2 _seq }
{ \int_use:N \l_tmpa_int }
}
% \exp_args:NNNx
\seq_gset_split:cno
{ g_fc_texttrans \g_fc_namespace_tl #2\l_texttranslinenum_tl _seq }
{ glt }
{
\l_texttransline_tl
% \seq_item:cn
% { g_fc_rwe \g_fc_namespace_tl #2 _seq }
% { \int_use:N \l_tmpa_int }
}
%=
%% \seq_show:c
%% { g_fc_texttrans \g_fc_namespace_tl #2\l_texttranslinenum_tl _seq }
% store the text
\tl_set:Nx
\l_tmpb_tl
{
% \seq_item:cn
% { g_fc_rwe \g_fc_namespace_tl #2 _seq }
% { \int_use:N \l_tmpa_int }
\seq_item:cn
{ g_fc_texttrans \g_fc_namespace_tl #2\l_texttranslinenum_tl _seq }
{ 1 }
}
% \tl_show:N
% \l_tmpb_tl
\mfsloadwords { \int_use:N \l_tmpa_int }{ \tl_use:N \l_tmpb_tl }
\int_incr:N
\l_tmpa_int
}
% ===============================
% box everything: (line,word) coord
\int_set:Nn
\l_tmpa_int
{ 1 }
\int_do_until:nNnn % for each line
{ \l_tmpa_int } > { \g_gloss_licount_int }
{
\tl_set:Nx
\g_fc_mylinenum_tl
{ \int_use:N \l_tmpa_int }
% \seq_show:c
% { g_fc_line \g_fc_wnamespace_tl \g_fc_mylinenum_tl _seq }
\exp_args:NNx
\int_set:Nn
\g_gloss_wordsonthisline_int
{
\seq_count:c
{ g_fc_line \g_fc_wnamespace_tl \g_fc_mylinenum_tl _seq }
}
% \int_show:N
% \g_gloss_wordsonthisline_int
\int_set:Nn
\l_tmpb_int
{ 1 }
\int_do_until:nNnn % for each word
{ \l_tmpb_int } > { \g_gloss_wordsonthisline_int }
{
%---start
\tl_gset:Nx \g_gloss_currentline_tl { \int_use:N \l_tmpa_int }
\tl_gset:Nx \g_gloss_currentword_tl { \int_use:N \l_tmpb_int }
\cs_if_free:cT
{ g_gloss_line\g_gloss_currentline_tl word\g_gloss_currentword_tl _box }
{ \box_new:c
{ g_gloss_line\g_gloss_currentline_tl word\g_gloss_currentword_tl _box }
}
%xxx-start
% \hbox_gset:cn
% { g_gloss_line\g_gloss_currentline_tl word\g_gloss_currentword_tl _box }
% {
% \seq_item:cn
% { g_fc_line \g_fc_wnamespace_tl \g_fc_mylinenum_tl _seq }
% { \int_use:N \l_tmpb_int }
% }
\tl_set:Nx
\l_tmpc_tl
{
\seq_item:cn
{ g_fc_line \g_fc_wnamespace_tl \g_fc_mylinenum_tl _seq }
{ \int_use:N \l_tmpb_int }
}
%vvv
\regex_replace_all:nnN
{ (\.) }
{ \c{scshape} \0 }
\l_tmpc_tl
\hbox_gset:cn
{ g_gloss_line\g_gloss_currentline_tl word\g_gloss_currentword_tl _box }
{
\tl_use:N
\l_tmpc_tl
}
%------------------------ end compound gloss
%%%%=
%%% % show:
%%% \tex_par:D
%%% \box_use:c
%%% { g_gloss_line\g_gloss_currentline_tl word\g_gloss_currentword_tl _box } ~ \int_use:N \l_tmpa_int -- \int_use:N \l_tmpb_int :
%%% \the\box_wd:c
%%% { g_gloss_line\g_gloss_currentline_tl word\g_gloss_currentword_tl _box }
%%% .
%---end
\int_incr:N
\l_tmpb_int
}
\int_incr:N
\l_tmpa_int
}
% ===============================
% find widest box by word number
\int_set:Nn
\l_tmpb_int
{ 1 }
\int_do_until:nNnn % for each word
{ \l_tmpb_int } > { \g_gloss_wordsonthisline_int } %%%
{
%% \tl_set:Nx
%% \g_fc_mylinenum_tl
%% { \int_use:N \l_tmpa_int }
%%% \seq_show:c
%%% { g_fc_line \g_fc_wnamespace_tl \g_fc_mylinenum_tl _seq }
%%
%% \exp_args:NNx
%% \int_set:Nn
%% \g_gloss_wordsonthisline_int
%% {
%% \seq_count:c
%% { g_fc_line \g_fc_wnamespace_tl \g_fc_mylinenum_tl _seq }
%% }
%%% \int_show:N
%%% \g_gloss_wordsonthisline_int
\int_set:Nn
\l_tmpa_int
{ 1 }
\int_do_until:nNnn % for each line
{ \l_tmpa_int } > { \g_gloss_licount_int }
{
%---start
\tl_gset:Nx \g_gloss_currentline_tl { \int_use:N \l_tmpa_int }
\tl_gset:Nx \g_gloss_currentword_tl { \int_use:N \l_tmpb_int }
\cs_if_free:cT
{ g_gloss_wordwidth\g_gloss_currentword_tl _dim }
{ \dim_new:c
{ g_gloss_wordwidth\g_gloss_currentword_tl _dim }
}
%IF
%\exp_args:xNx
\dim_compare:nNnT
{
\box_wd:c
{ g_gloss_line\g_gloss_currentline_tl word\g_gloss_currentword_tl _box }
}
>
{
\dim_use:c
{ g_gloss_wordwidth\g_gloss_currentword_tl _dim }
}
{
% SET WORDXWIDTH-EQ
\dim_set:cn
{ g_gloss_wordwidth\g_gloss_currentword_tl _dim }
{
\box_wd:c
{ g_gloss_line\g_gloss_currentline_tl word\g_gloss_currentword_tl _box }
}
}
%% \cs_if_free:cT
%% { g_gloss_line\g_gloss_currentline_tl word\g_gloss_currentword_tl _box }
%% { \box_new:c
%% { g_gloss_line\g_gloss_currentline_tl word\g_gloss_currentword_tl _box }
%% }
%% \hbox_gset:cn
%% { g_gloss_line\g_gloss_currentline_tl word\g_gloss_currentword_tl _box }
%% {
%% \seq_item:cn
%% { g_fc_line \g_fc_wnamespace_tl \g_fc_mylinenum_tl _seq }
%% { \int_use:N \l_tmpb_int }
%%
%% }
%% % show:
%% \tex_par:D
%% \box_use:c
%% { g_gloss_line\g_gloss_currentline_tl word\g_gloss_currentword_tl _box } ~ \int_use:N \l_tmpa_int -- \int_use:N \l_tmpb_int :
%% \the\box_wd:c
%% { g_gloss_line\g_gloss_currentline_tl word\g_gloss_currentword_tl _box }
%% .
%%%---end
\int_incr:N
\l_tmpa_int
}
\int_incr:N
\l_tmpb_int
%%%%=
%%%Widest
%%%\g_gloss_currentword_tl
%%%=
%%% \dim_use:c
%%% { g_gloss_wordwidth\g_gloss_currentword_tl _dim }
}
% ===============================
% set each nth word to widest width
% \tex_par:D %=
\leavevmode\tex_space:D \\%=
% \tex_par:D %=
\int_set:Nn
\l_tmpa_int
{ 1 }
\int_do_until:nNnn % for each line
{ \l_tmpa_int } > { \g_gloss_licount_int }
{
\makebox[1.2in]{} %=
%+++
%+++
\int_set:Nn
\l_tmpb_int
{ 1 }
\int_do_until:nNnn % for each word
{ \l_tmpb_int } > { \g_gloss_wordsonthisline_int } %%%
{
%---start
\tl_gset:Nx \g_gloss_currentline_tl { \int_use:N \l_tmpa_int }
\tl_gset:Nx \g_gloss_currentword_tl { \int_use:N \l_tmpb_int }
\box_gset_wd:cn
{ g_gloss_line\g_gloss_currentline_tl word\g_gloss_currentword_tl _box }
{
\dim_use:c
{ g_gloss_wordwidth\g_gloss_currentword_tl _dim }
}
\int_incr:N
\l_tmpb_int
\box_use:c %=
{ g_gloss_line\g_gloss_currentline_tl word\g_gloss_currentword_tl _box }
\tex_space:D %=
\tex_space:D %=
}
\int_incr:N
\l_tmpa_int
% \tex_par:D \space%=
%%\seq_item:cn
%% { g_fc_texttrans \g_fc_namespace_tl #2\l_texttranslinenum_tl _seq }
\int_set:Nn
\l_texttransline_int
{
\seq_count:c
{ g_fc_texttrans \g_fc_namespace_tl #2\g_gloss_currentline_tl _seq }
}
% \int_show:N
% \l_texttransline_int
\int_compare:nNnT
{ \l_texttransline_int } > { 1 }
{
%loop through the translations
\int_set:Nn
\l_texttransloop_int
{ 2 }
\int_do_until:nNnn % for each translation
{ \l_texttransloop_int } > { \l_texttransline_int } %%%
{
\\%=
\makebox[1.2in]{} %=
\seq_item:cn
{ g_fc_texttrans \g_fc_namespace_tl #2\g_gloss_currentline_tl _seq }
{ \l_texttransloop_int }
\int_incr:N
\l_texttransloop_int
}
}
\\%=
}
}
%--------------------
\NewDocumentCommand { \mfsloadaseq } { o m +m } {
% 1=namespace
% 2=seq name
% 3=data
\IfNoValueTF { #1 }
{ \tl_clear:N \g_fc_namespace_tl }
{ \tl_gset:Nn \g_fc_namespace_tl { #1 } }
\cs_if_free:cT
{ g_fc_rwe \g_fc_namespace_tl #2 _seq }
{ \seq_new:c
{ g_fc_rwe \g_fc_namespace_tl #2 _seq }
}
\seq_gclear:c
{ g_fc_rwe \g_fc_namespace_tl #2 _seq }
\seq_gset_split:cno
{ g_fc_rwe \g_fc_namespace_tl #2 _seq }
{ , }
{ #3 }
% \seq_show:c
% { g_fc_rwe \g_fc_namespace_tl #2 _seq }
}
%****************************************************
%*
%****************************************************
%--------------------
\NewDocumentCommand { \mfsloadaprop } { o m +m } { % 1=NS, 2=prop name, 3=data
\IfNoValueTF { #1 }
{ \tl_clear:N \g_fc_namespace_tl }
{ \tl_gset:Nn \g_fc_namespace_tl { #1 } }
\cs_if_free:cT
{ g_fc_rwe \g_fc_namespace_tl #2 _prop }
{ \prop_new:c
{ g_fc_rwe \g_fc_namespace_tl #2 _prop }
}
\prop_gclear:c
{ g_fc_rwe \g_fc_namespace_tl #2 _prop }
\prop_gset_from_keyval:cn
{ g_fc_rwe \g_fc_namespace_tl #2 _prop }
{ #3 }
}
\ExplSyntaxOff
\begin{document}
\mfsloadaseql[gloss]{ex1}{*/}{%
gef hundinum matinn
*/ gje hunden maten
*/ give {the dog} {the food}
*/ gib {dem Hunde} {das Essen}
}
\squiggle
\mfsloadaseql[gloss]{ex2}{*/}{%
Auto uderzył dziecko.
*/ car.nom hit.3sg child.acc
glt `The car hit the child.'
*/ car.acc hit.3sg child.nom
glt `The child hit the car.'
}
\squiggle
\mfsloadaseql[tale]{ex1}{xx}{%
The cat sat on the mat.
xx article.def noun.nom verb.3pps .prep .def .loc
glt Phonological congruence
glt Contrary to The quick brown fox
glt Single syllables
glt Feline habitude
}
\end{document}