带有 N 个点的省略号

带有 N 个点的省略号

如何定义一个 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}

最后一行模拟了不受空间因素影响的正常空间,以便体会其中的差异。

在此处输入图片描述

相关内容