在 linguex 中使用用户定义的命令而不占用空间

在 linguex 中使用用户定义的命令而不占用空间

我使用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}

我对于例子中的语言亵渎表示歉意。;-)

在此处输入图片描述

相关内容