这是使用 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
当然,有了 就更容易了。