具有替代注释和翻译的语言示例

具有替代注释和翻译的语言示例

我正在写一篇语言学论文,需要为一个例子展示替代注释和翻译。我在这里找到了这个例子(使用 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.'

使用 或 可以实现这样的效果gb4elangsci-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

这是可能的。

光泽 POC

或多或少是命令的灵活替代品\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}

相关内容