我使用linguex
自己定义的命令来将语法类别排版为小写字母。例如,我必须\newcommand{\sg}{\textsc{sg}}
排版 SG(=单数)注释。如果我想更改注释方案,这也很方便。但这会造成一点不便,因为命令会“吞噬”其后的空间。因此,为了使注释正确,我必须在每个这样的命令后放置 {},如以下 MWE 所示:
\documentclass{article}
\usepackage{linguex}
\newcommand{\sg}{\textsc{sg}}
\begin{document}
I would like this to work, but it doesn't:
\exg. I am here! \\
1\sg be.1\sg here \\
Instead, I have to use this syntax:
\exg. I am here! \\
1\sg{} be.1\sg{} here \\
\end{document}
在命令定义中使用\xspace
没有帮助。还有其他解决方案可以帮助我避免一直使用 {} 吗?
答案1
我不确定我是否会推荐它,但您可以在本地创建一个空格而不是普通空格,这样它就不会被删除,然后\foo
用普通空格替换所有特殊空格,以便\exg
宏可以看到它们。
\documentclass{article}
\usepackage{linguex}
\newcommand{\sg}{\textsc{sg}}
\def\zztmp{\$}
{\obeyspaces\catcode`\~10\relax\makeatletter
\gdef\zz{\begingroup\obeyspaces\zzz}%
\gdef\zzz#1{\endgroup\zzzz{}#1 \$ }%
\gdef\zzzz#1#2 {%
\def\tmp{#2}\ifx\tmp\zztmp
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi
{#1}{\zzzz{#1#2~}}}}
\begin{document}
I would like this to work, but it doesn't:
\zz{
\exg. I am here! \\
1\sg be.1\sg here \\
}
Instead, I have to use this syntax:
\exg. I am here! \\
1\sg{} be.1\sg{} here \\
\end{document}
答案2
问题在于\exg
使用空格将输入拆分成几部分,以便能够对齐它们。但后面\sg
没有空格,因为它在标记化时被忽略,因此在宏扩展处理器的操作期间看不到它。因此,解决方案可能是在这些特殊命令后面加上句点。
根据要求,只有当下一个标记不是空格时,才会打印句号。缺点是句号强制的缩写之后。
\documentclass{article}
\usepackage{linguex}
\makeatletter
\newcommand{\newabbreviation}[2]{%
\@ifdefinable{#1}{\@newabbreviation{#1}{#2}}%
}
\newcommand\@newabbreviation[2]{%
\def#1.{#2\@checkspace}%
}
\newcommand\@checkspace{%
\futurelet\@let@token\@check@space
}
\newcommand\@check@space{%
\ifx\@let@token\@sptoken\else.\fi
}
\makeatother
\newabbreviation{\sg}{\textsc{sg}}
\newabbreviation{\masc}{\textsc{masc}}
\begin{document}
This seems to work:
\exg. I am here! \\
1\sg. be.1\sg.\masc. here \\
\end{document}
我对于例子中的语言亵渎表示歉意。;-)