我喜欢在一些内联文本列表(例如年份数字)中使用细空格。例如: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}
。