如何定义一个 lualatex 宏\lip
,采用可选参数 * 和 [N] ,使得在没有参数的情况下,扩展是一个由三个点组成的省略号,使用 [N] 时有 N 个点,使用 * 时结束一个句子?应该可以像 \lip 这样使用它,即不用 结束它{}
。
PS. 理想情况下,如果省略号后面跟着逗号,最后一个点与逗号之间的间距应该与点之间的间距相同。
答案1
你不需要 LuaLaTeX 来实现这一点,使用以下方法可以轻松完成expl3
:
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{expl3,xparse}
\ExplSyntaxOn
\NewDocumentCommand\lip{s O{3}}{
$
\prg_replicate:nn{#2}{\ldotp}
$
\IfBooleanT{#1}{\spacefactor\sfcode`\.\relax}
}
\ExplSyntaxOff
\begin{document}
Hello \lip, I know how to write dots: \lip*[10] Anyway \lip[3] not all dots end sentences.
\end{document}
当然,如果你像 一样使用它some \lips words
,TeX 会占用空间。即使使用 LuaTeX 也很难避免这种情况,因为 LuaTeX 不会改变 TeX 解析规则。当然,如果你使用星号或可选参数,则不存在此问题。
如果你真的需要它,我能想到有三个选择:
- 如果没有给出参数,则始终添加空格。例如,这会破坏
\lip,
上例中的。 - 使用
xspace
但要记住缺点
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{expl3,xparse,xspace}
\ExplSyntaxOn
\NewDocumentCommand\lip{s o}{
$
\prg_replicate:nn{\IfValueTF{#2}{#2}{3}}{\ldotp}
$
\IfBooleanTF{#1}{
\spacefactor\sfcode`\.\relax
}{
\IfValueF{#2}{\xspace}
}
}
\ExplSyntaxOff
\begin{document}
Hello \lip, I know how to write dots: \lip*[10] Anyway \lip not all dots end sentences.
\end{document}
- “LuaTeX 解决方案”:使用
process_input_buffer
回调检测所有输入行的\lip
使用位置,并在之后始终添加显式空格。这将非常脆弱,并且无法与宏等正确交互。
因此,当发生这种情况时,手动添加\
或删除会更加可靠[3]
。
答案2
\documentclass{article}
\makeatletter
\def\lip{\@ifstar{\let\@liptmp\relax\@lip}{\let\@liptmp\@\@lip}}
\newcommand\@lip[1][3]{{\uccode`m=`.\uppercase\expandafter{\romannumeral#1000}}\@liptmp\space \ignorespaces}
\begin{document}
aaa\lip[5] bbb aaa\lip bbb aaa\lip[7] bbb
aaa\lip*[5] bbb aaa\lip* bbb aaa\lip*[7] bbb
\end{document}
答案3
我猜想\lips*
你想要一个正常的空间(受空间因素影响):
\documentclass{article}
\usepackage{xparse}
% the definition of \textellipsis is
% .\kern\fontdimen3\font
% repeated three times
\ExplSyntaxOn
\NewDocumentCommand{\lips}{sO{3}}
{
\prg_replicate:nn { #2 } { .\kern\fontdimen3\font }
\IfBooleanT{#1}
{ \unkern\spacefactor 3000 \scan_stop: \c_space_tl }
\ignorespaces
}
\ExplSyntaxOff
\begin{document}
Three \lips Four \lips[4] Five \lips[5], with a comma
Here is \lips It was not end of sentence.
Here is \lips* It was end of sentence.
Here is \mbox{\lips\unkern} It was not end of sentence
\end{document}
最后一行模拟了不受空间因素影响的正常空间,以便体会其中的差异。