用于将宏参数扩展为 gb4e 的 \gll 的宏

用于将宏参数扩展为 gb4e 的 \gll 的宏

这是使用 datatool 时 gb4e 的间距问题,我试图用 循环遍历存储在 CSV 中的注释,datatool并用 打印它们gb4e\gll问题是我向\gll命令传递了宏参数,而它需要带空格的字符串。

尼古拉提供了解决方案对于我的问题,这导致宏参数在看到它们\gll之前被扩展\gll,以便它可以适当地处理间距。

她的解决方案是在命令范围内\doex使用创建一个宏。\edef\DTLforeach

我现在有理由在多个实例中执行同样的事情\DTLforeach,所以我想知道是否有办法全局定义该\doex命令,这样我就不必每次需要执行此操作时都重新定义它。

\doex理想情况下,如果能够将列名传递给命令,而不是将它们硬编码到宏中,那就太好了。

这是一个最小的- 工作示例说明了我所追求的目标。如果可能的话,我还希望您能提供一些评论,解释为什么这不起作用以及您提出的解决方案为什么有效。我想更好地了解宏扩展如何与 LaTeX 配合使用。

\documentclass{article}

\begin{filecontents*}{glosses1.csv}
MyIpa,MyGloss,MyTranslation
sonj2n-i motun kuki-lul an-m2k-ess-ta,boy-NOM all cookie-ACC NEG-eat-PST-DEC,The boy didn't eat every cookie
\end{filecontents*}

\begin{filecontents*}{glosses2.csv}
IPA,GLOSS,TRANSLATION
\textipa{sonj2n-i} \textipa{motun} \textipa{kuki-lul} \textipa{an-m2k-ess-ta},boy-NOM all cookie-ACC NEG-eat-PST-DEC,The boy didn't eat every cookie
\end{filecontents*}

\usepackage{datatool}
\DTLloaddb{glosses1}{glosses1.csv}
\DTLloaddb{glosses2}{glosses2.csv}

\usepackage[T1]{tipa}
\usepackage{gb4e}

% This doesn't work
\newcommand*{\doex}[3]{
  \noexpand\ex[]{\noexpand\gll 
  \expandonce#1 \noexpand\\
  \expandonce#2 \noexpand\\
  \noexpand\trans `\expandonce#3'}}

\begin{document}

\DTLforeach{glosses1}{%
\MyIpa=MyIpa,
\MyGloss=MyGloss,
\MyTranslation=MyTranslation}{%
\begin{exe}
  \doex{\MyIpa}{\MyGloss}{\MyTranslation}
\end{exe}
}

\DTLforeach{glosses2}{%
\IPA=IPA,
\GLOSS=GLOSS,
\TRANS=TRANSLATION}{%
\begin{exe}
  \doex{\IPA}{\GLOSS}{\TRANS}
\end{exe}
}

\end{document}

答案1

您必须添加一个抽象层:

\documentclass{article}

\begin{filecontents*}{glosses1.csv}
MyIpa,MyGloss,MyTranslation
sonj2n-i motun kuki-lul an-m2k-ess-ta,boy-NOM all cookie-ACC NEG-eat-PST-DEC,The boy didn't eat every cookie
\end{filecontents*}

\begin{filecontents*}{glosses2.csv}
IPA,GLOSS,TRANSLATION
\textipa{sonj2n-i} \textipa{motun} \textipa{kuki-lul} \textipa{an-m2k-ess-ta},boy-NOM all cookie-ACC NEG-eat-PST-DEC,The boy didn't eat every cookie
\end{filecontents*}

\usepackage{datatool}
\DTLloaddb{glosses1}{glosses1.csv}
\DTLloaddb{glosses2}{glosses2.csv}

\usepackage[T1]{tipa}
\usepackage{gb4e}

\newcommand*{\doex}[3]{%
  \begingroup\edef\x{\endgroup
    \noexpand\ex[]{%
      \noexpand\gll 
      \expandonce#1 \noexpand\\
      \expandonce#2 \noexpand\\
      \noexpand\trans`\expandonce#3'%
    }%
  }\x
}

\begin{document}

\DTLforeach{glosses1}{%
\MyIpa=MyIpa,
\MyGloss=MyGloss,
\MyTranslation=MyTranslation}{%
\begin{exe}
  \doex{\MyIpa}{\MyGloss}{\MyTranslation}
\end{exe}
}

\DTLforeach{glosses2}{%
\IPA=IPA,
\GLOSS=GLOSS,
\TRANS=TRANSLATION}{%
\begin{exe}
  \doex{\IPA}{\GLOSS}{\TRANS}
\end{exe}
}

\end{document}

在此处输入图片描述

xparse当然,有了 就更容易了。

相关内容