使用 ExPex 从右到左环境中的示例数字

使用 ExPex 从右到左环境中的示例数字

我很高兴看到 expex 几乎完美地处理了从右到左语言的行间文本。然而,有一个问题是示例数字放在右边距,而不是与页面中的文本对齐。我目前正在解决这个问题,将整个注释行放在一个迷你页面中(下面注释的行),但如果可以的话,我想避免这种情况,以便注释行可以跨页面。

\documentclass{book}
\usepackage[a4paper,left=2cm,right=2cm,top=2cm,bottom=2cm]{geometry}
\usepackage{expex,polyglossia,lipsum}
\setdefaultlanguage[variant=american]{english}
\setotherlanguage[numerals=eastern]{farsi}
\newfontfamily\englishfont[Mapping=tex-text]{Times New Roman}
\newfontfamily\farsifont[Script=arab,Scale=MatchLowercase]{Scheherazade}
\begin{document}
\lipsum[1]
%\begin{minipage}{155mm}
\begin{farsi}
\ex[everyglb=\englishfont] \begingl
\gla این مثال من است// 
\glb in masale man ast //
\glb this example me is //
\endgl\xe
\end{farsi}
%\end{minipage}
\end{document}

答案1

\ex@c通过编辑和,我能够获得正确的行为\glw@begingl@a。在这两种情况下,我都能找出适合 RTL 上下文的一些替代代码。

我的修改是\ex@c

   % \llap{\hbox to\leftskip{\unhbox\numbox \hss}}%
   \if@RTL
     \hbox to\leftskip{\unhbox\numbox \hss}%
   \else
     \llap{\hbox to\leftskip{\unhbox\numbox \hss}}%
   \fi

我的修改是\glw@begingl@a

           % \advance\hsize by -\leftskip
           \if@RTL
              \advance\hsize by -2\leftskip
           \else
              \advance\hsize by -\leftskip
           \fi

不幸的是,以下 MWE 并不简单。我说明了 LTR 普通示例和注释(均未改变)、RTL 普通示例、RTL 注释和 RTL 多行注释的正确边距对齐方式。

\documentclass[a4paper]{article}
\usepackage{fullpage,polyglossia,expex,lipsum}
\setdefaultlanguage{english}
\setotherlanguage{farsi}
\setmainfont[Mapping=tex-text]{Charis SIL}
\newfontfamily\englishfont[Mapping=tex-text]{Charis SIL}
\newfontfamily\farsifont[Script=arab,Scale=1.25]{Adobe Arabic}
\begin{document}

\makeatletter
\def\ex@c{%
   \ex@setup
   \leavevmode
   \setbox\numbox=\hbox{\hskip\lingnumoffset\ep@actualexnoprint}%
   \epd@numright=\wd\numbox
   \ifcase\ep@textanchor                          % numleft
         \ep@settosum\leftskip\lingnumoffset\lingtextoffset
      \or                                         % normal
         \ep@settosum\leftskip\epd@numright\lingtextoffset
      \fi
   % begin changes
   % \llap{\hbox to\leftskip{\unhbox\numbox \hss}}%
   \if@RTL
     \hbox to\leftskip{\unhbox\numbox \hss}%
   \else
     \llap{\hbox to\leftskip{\unhbox\numbox \hss}}%
   \fi
   % end changes
   \lingeveryex
   \latex@tagex
   \ignorespaces
}

\def\glw@begingl@a{%
   \bgroup
   \parindent0pt
   \ep@setglstrut
   \ifdim\ling@glwidth=0pt
      \ifling@glossbreaking
         \bgroup
       \else
         \vtop\bgroup
           % begin changes
           % \advance\hsize by -\leftskip
           \if@RTL
              \advance\hsize by -2\leftskip
           \else
              \advance\hsize by -\leftskip
           \fi
           % end changes
            \advance\hsize by -\rightskip
            \leftskip=0pt
       \fi
   \else
      \vtop\bgroup
         \hsize=\ling@glwidth
         \leftskip=0pt
   \fi
   \bgroup
   \parindent=0pt
   \@glpreamblefalse
   \@glftfalse
   \let\mainlist=\empty
   \let\itemtypelist=\empty
   \let\aboveskiplist=\empty
   \let\strutlist=\empty
   \let\everylist=\empty
}
\makeatother

% for seeing the margins:
\hrule

% LTR expex environments are not affected:
\ex Ahmad is asking me for forgiveness. \xe

\ex
\begingl
\gla ahmad az ma ʊzr-xʌ-ji me-kʊn-a //
\glc Ahmad from \textsc{1s} pardon-want-\textsc{nom} \textsc{cont}-do-\textsc{3s} //
\endgl
\xe

\hrule

% proper right margin for RTL languages with simple \ex\xe
\begin{farsi}
\ex
احمد از من عذرخواهی می‌کند.
\xe
\end{farsi}

\hrule

% proper right margin for RTL languages with glosses
\begin{farsi}
\ex 
\begingl
\gla احمد از من عذرخواهی می‌کند. //

\glb \textenglish{ahmad} \textenglish{az} \textenglish{man} \textenglish{ʊzr-xwʌh -i} \textenglish{me-kʊn-ad} //

\glc \textenglish{Ahmad} \textenglish{from} \textenglish{\textsc{1s}} \textenglish{pardon-want-\textsc{nom}} \textenglish{\textsc{cont}-do-\textsc{3s}} //
\endgl
\xe
\end{farsi}

\hrule

% also works for multiline RTL glosses
\begin{farsi}
\ex
\begingl
\gla {محمد} {اشرف} {غنی} {احمدزی،} {رئیس} {جمهور} {افغانستان} {با} {صدور} {فرمانی} {اعلام} {کرد} {که} {تمام} {والیان} {۳۴} {ولایت} {این} {کشور} {بعد} {از} {این} {به} {عنوان} {سرپرست} {به} {کار} {خود} {ادامه} {دهند.} //

\glb \textenglish{mʊhamad} \textenglish{aʃraf} \textenglish{ɣani} \textenglish{ahmadzaj} \textenglish{rajis-ɛ} \textenglish{dʒamhur-ɛ} \textenglish{afɣʌnɛstʌn} \textenglish{bʌ} \textenglish{sʊdur-ɛ} \textenglish{farmʌn-e} \textenglish{ɛlʌm} \textenglish{kard} \textenglish{ke} \textenglish{tamʌm-ɛ} \textenglish{wʌli-jʌn-ɛ} \textenglish{si-o-tʃʌr} \textenglish{wʊlʌjat-ɛ} \textenglish{in} \textenglish{kɛʃwar} \textenglish{bad} \textenglish{az} \textenglish{in} \textenglish{ba} \textenglish{ɛnwʌn-ɛ} \textenglish{sarparast} \textenglish{ba} \textenglish{kʌr-ɛ} \textenglish{xʊd} \textenglish{ɛdʌma} \textenglish{dɛh-and} //

\glc \textenglish{Muhammad} \textenglish{Ashraf} \textenglish{Ghani} \textenglish{Ahmadzai} \textenglish{boss-\textsc{ez}} \textenglish{republic-\textsc{ez}} \textenglish{Afghanistan} \textenglish{with} \textenglish{issuance-\textsc{ez}} \textenglish{command-\textsc{indef}} \textenglish{announcement} \textenglish{do\textsc{.pst}} \textenglish{that} \textenglish{all-\textsc{ez}} \textenglish{governor-\textsc{pl}-\textsc{ez}} \textenglish{thirty-and-four} \textenglish{province-\textsc{ez}} \textenglish{this} \textenglish{country} \textenglish{later} \textenglish{from} \textenglish{this} \textenglish{to} \textenglish{title-\textsc{ez}} \textenglish{supervisor} \textenglish{to} \textenglish{work-\textsc{ez}} \textenglish{own} \textenglish{continue} \textenglish{give-\textsc{3p}} //
\endgl
\xe
\end{farsi}

\hrule

\end{document}

答案2

虽然这是一个老问题,但我偶然发现了这个问题并找到了一个非常简单的解决方案:在环境中包含语言选择\ex ... \xe。这也解决了换行符的问题,并消除了\glpreamble和的问题\glft,这两个问题在其他解决方案中定位不佳。@Jason Zentz 的答案示例变为:

\documentclass{book}
\usepackage[a4paper,left=2cm,right=2cm,top=2cm,bottom=2cm]{geometry}
\usepackage{expex,polyglossia,lipsum}
\usepackage{showframe} % used to show lines at margins
\setdefaultlanguage[variant=american]{english}
\setotherlanguage{persian} % I got an error message using farsi; new setting(?)
\newfontfamily\englishfont[Mapping=tex-text]{Times New Roman}
\newfontfamily\persianfont[Script=Arabic,Scale=MatchLowercase]{Scheherazade}
\begin{document}
\lipsum[1]

\ex[everyglb=\englishfont]
    \begin{persian}
    \begingl
        \gla این مثال من است// 
        \glb in masale man ast //
        \glb this example me is //
    \endgl
    \end{persian}
\xe

\excnt 99999\relax % to create a wider label
\ex[everyglb=\englishfont]
    \begin{persian}
    \begingl
        \gla این مثال من است// 
        \glb in masale man ast //
        \glb this example me is //
    \endgl
    \end{persian}
\xe

% long example does break across lines  
\excnt 2\relax
\ex[everyglb=\englishfont]
    \begin{persian}
    \begingl
        \gla این مثال من است این مثال من است این مثال من است این مثال من است این مثال من است این مثال من است این مثال من است این مثال من است// 
        \glb in masale man ast in masale man ast in masale man ast in masale man ast in masale man ast in masale man ast in masale man ast //
        \glb this example me is this example me is this example me is this example me is this example me is this example me this example me this example me //
    \endgl
    \end{persian}
\xe

\end{document}

示例1

答案3

这似乎numoffset是我们想要操纵的参数,以便将数字保持在正确的范围内(但不在正确的范围内),但无论是正值还是负值都不会对您的 MWE 产生任何影响。

如果设置textoffset-\textwidth,数字将与左边距对齐。更宽的标签可以正确处理。但是,这会破坏 的expex换行算法,因此它可能不是一个可行的解决方案,并且根据正文的语言,您可能不希望数字位于左侧。

在此处输入图片描述

\documentclass{book}
\usepackage[a4paper,left=2cm,right=2cm,top=2cm,bottom=2cm]{geometry}
\usepackage{expex,polyglossia,lipsum}
\lingset{textoffset=-\textwidth}
\usepackage{showframe} % used to show lines at margins
\setdefaultlanguage[variant=american]{english}
\setotherlanguage[numerals=eastern]{farsi}
\newfontfamily\englishfont[Mapping=tex-text]{Times New Roman}
\newfontfamily\farsifont[Script=arab,Scale=MatchLowercase]{Scheherazade}

\begin{document}
\lipsum[1]
\begin{farsi}
    \ex[everyglb=\englishfont] \begingl
    \gla این مثال من است// 
    \glb in masale man ast //
    \glb this example me is //
    \endgl\xe
\end{farsi}

\excnt 99999\relax % to create a wider label
\begin{farsi}
    \ex[everyglb=\englishfont] \begingl
    \gla این مثال من است// 
    \glb in masale man ast //
    \glb this example me is //
    \endgl\xe
\end{farsi}

% long example doesn't break across lines   
\excnt 2\relax
\begin{farsi}
    \ex[everyglb=\englishfont] \begingl
    \gla این مثال من است این مثال من است این مثال من است این مثال من است این مثال من است این مثال من است این مثال من است این مثال من است// 
    \glb in masale man ast in masale man ast in masale man ast in masale man ast in masale man ast in masale man ast in masale man ast //
    \glb this example me is this example me is this example me is this example me is this example me is this example me this example me this example me //
    \endgl\xe
\end{farsi}
\end{document}

我建议发送电子邮件至Ling-TeX 列表。该软件包的作者 John Frampton 在那里回答expex问题,但他很少出现在这个网站上。

相关内容