使用 expex 和 phonrule 将不同行上的音位规则相互对齐

使用 expex 和 phonrule 将不同行上的音位规则相互对齐

我正在尝试将三条重写规则相互排版。每条规则都包含在一个 expex 示例中,以与文档中其他地方的编号保持一致。目前,我有以下内容:

三个不一致的重写规则

可以使用以下代码生成:

\documentclass{scrreprt}

\usepackage{expex}  
\usepackage{phonrule}

\begin{document}
    
\pex
\a
\phon{1m.Irr}{\oneof[l]{
    \envr*{ŋaŋ}{[+son]} \\
    \envr*{ŋaŋu}{[$-$son]}}}
\a
\phon{12m.Irr}{\oneof[l]{
    \envr*{naŋ}{[+son]} \\
    \envr*{naŋu}{[$-$son]}}}
\a
\phon{2m.R}{\oneof[l]{
    \envr*{nuŋ}{[+son]} \\
    \envr*{nuŋu}{[$-$son]}}}
\xe

\end{document}

但是,对齐方式非常难看。具体来说,我想将每个规则中的箭头、括号和环境水平对齐。如果可能的话,我希望得到有关对齐示例的通用解决方案的建议,因为这个问题经常出现;但是,我不想为了实现这一点而花费数周时间学习 tex 编程的来龙去脉!

这里发布了几个问题和答案,涉及使用 phonrule 对规则内的单个元素进行对齐,但据我所知,之前没有人问过有关跨多个规则的元素对齐的问题。

答案1

我认为,最简单的解决方案是为音位规则的第一部分制作一个固定宽度的框。然后箭头将全部正确排列。这是宏的修改版本,\phon\fphon使用最初设置为组中最长字符串的长度。您可以全局设置它(如果规则左侧的大多数长度大致相同)或每个示例集本地设置它。

\documentclass{scrreprt}

\usepackage{expex}  
\usepackage{phonrule}
\usepackage{calc}
\newlength{\fixedlen}
\setlength{\fixedlen}{\widthof{12m.Irr}}
\newcommand{\fphon}[3][\parrow]{\parbox{\fixedlen}{#2} #1 #3}
\begin{document}
    
\pex
\a
\fphon{1m.Irr}{\oneof[l]{
    \envr*{ŋaŋ}{[+son]} \\
    \envr*{ŋaŋu}{[$-$son]}}}
\a
\fphon{12m.Irr}{\oneof[l]{
    \envr*{naŋ}{[+son]} \\
    \envr*{naŋu}{[$-$son]}}}
\a
\fphon{2m.R}{\oneof[l]{
    \envr*{nuŋ}{[+son]} \\
    \envr*{nuŋu}{[$-$son]}}}
\xe

\end{document}

代码输出

如果您还希望斜线对齐,那么您可以修改内部\@env命令以使用固定宽度的框:

\documentclass{scrreprt}

\usepackage{expex}  
\usepackage{phonrule}
\usepackage{calc}
\newlength{\fixedlen}
\newlength{\rfixedlen}
\setlength{\fixedlen}{\widthof{12m.Irr}}
\setlength{\rfixedlen}{2em}
\newcommand{\fphon}[3][\parrow]{\parbox{\fixedlen}{#2} #1 #3}
\makeatletter
\renewcommand*{\@env}[3]{\parbox{\rfixedlen}{#2}~/#1#3}
\makeatother
\begin{document}
    
\pex
\a
\fphon{1m.Irr}{\oneof[l]{
    \envr*{ŋaŋ}{[+son]} \\
    \envr*{ŋaŋu}{[$-$son]}}}
\a
\fphon{12m.Irr}{\oneof[l]{
    \envr*{naŋ}{[+son]} \\
    \envr*{naŋu}{[$-$son]}}}
\a
\fphon{2m.R}{\oneof[l]{
    \envr*{nuŋ}{[+son]} \\
    \envr*{nuŋu}{[$-$son]}}}
\xe

\end{document}

第二个代码的输出

相关内容