命令生成断续的半空间或断续空间,但不生成完整空间

命令生成断续的半空间或断续空间,但不生成完整空间

我喜欢在一些内联文本列表(例如年份数字)中使用细空格。例如:2001、2002、2005、2022。为了压缩所需的空间,我一直\,在这些年份数字之间使用空格而不是空格。

但是,偶尔我会遇到换行问题,因为年份被 粘在了一起\,

所以,问题是哪个命令允许可破坏的薄空间。

答案1

我建议为这些系列定义自己的命令,而不是在逗号后添加一些容易出错的命令。

\documentclass{article}

\ExplSyntaxOn

\NewDocumentCommand{\tbspace}{}{\hspace{0.16667em}}

\NewDocumentCommand{\series}{sm}
 {
  \IfBooleanTF{#1}
   {
    \clist_use:nnnn { #2 } { ~ and\nobreakspace } { , ~ } { ~ and\nobreakspace }
   }
   {
    \clist_use:nn { #2 } { ,\tbspace }
   }
 }

\ExplSyntaxOff

\begin{document}

\series{2001, 2002, 2005, 2022}

\bigskip

\parbox[t]{0pt}{\series{2001, 2002, 2005, 2022}}

\bigskip

\series*{2001, 2002, 2005, 2022}

\end{document}

您会发现,只需添加*即可更改格式(如果需要)。零宽度\parbox表示逗号后可以换行。

在此处输入图片描述

答案2

当您使用原始元素且没有前置惩罚时,水平空间通常是可破坏的\hskip。我在 egreg 的答案中设置了相同数量的\tbspace类似元素,但(当然)我只使用了 TeX 原始元素。

\def\series #1{\def\seriesX{\def\seriesX{,\tbspace}}\seriesA #1, {}, }
\def\seriesA #1, {\ifx^#1^\else \seriesX#1\expandafter\seriesA\fi}
\def\tbspace{\hskip.16667em\relax}

\series{2001, 2002, 2005, 2022}

答案3

为了保险起见,需要一个基于 LuaLaTeX 的解决方案。:-)

在此处输入图片描述

% !TEX TS-program = lualatex
\documentclass{article}
\usepackage{luacode} % for '\luaexec' macro
\luaexec{ function series ( s )
            return ( s:gsub ( "[\%s]+" , "\\hspace{0.16666em}" ) )
          end }
\newcommand\series[1]{\directlua{tex.sprint(series("#1"))}}

\begin{document}
2001, 2002,  2005,   2022

\series{2001, 2002,  2005,  2022} % replace space with breakable thinspace
\end{document}

附录:为了完整性(也许也是为了让@wipet开心...),这里有一个解决方案,可以让 Lua 函数series同时适用于 LaTeX 和 PlainTeX。我没有发布相关的屏幕截图,因为输出与上面显示的相同。

% !TEX TS-program = lualatex
\documentclass{article}
\directlua{ function series ( s )
              return ( s:gsub ( "[\csstring\%s]+" , "\string\\hskip0.16666em\string\\relax" ) )
            end }
\newcommand\series[1]{\directlua{tex.sprint(series("#1"))}}

\begin{document}
2001, 2002,  2005,   2022

\series{2001, 2002,  2005,  2022} 
\end{document}

答案4

我发现“et al.” 应该有窄的还是满的、连续的还是断开的空间?这让我找到了代码et\hspace{.16667em}al.

我现在有了一个新命令 \newcommand{\tbspace}{\hspace{.16667em}}

这使我能够使用例如 \tbspace{2001},\tbspace{2002}

相关内容