我在缩写的名字和姓氏之间放置一个小的不间断空格,例如我写F.\,Fugmann
。 (德国名字。)
我注意到F.\,Fugmann
现在没有连字符,即使使用babel
德语连字符模式并放入\hyphenation{Fug-mann}
序言中。
由于这种行为会导致盒子过满(我目前通过编写进行调试)F.\,Fug\-mann
,我开始怀疑:
有没有办法可以自动实现我想要的行为?
F.\,Fug\-mann
从印刷的角度来看,是否建议将名字用连字符连接起来?
答案1
从 egreg 那里学到的一个技巧。如果你\nobreak\hspace{0pt}
在不可拆分空格和姓氏之间放置 ,姓氏将被重新评估为其自己的实体以进行连字符连接。下面,我将其编码为\?
放置小的不可拆分空格并重置下一个单词的“连字符性”。
\documentclass{article}
\newcommand\?{\,\nobreak\hspace{0pt}}
\textwidth0pt\relax
\begin{document}
\hyphenation{Fug-mann}
Start
Fugmann
F.\,Fugmann
F.\?Fugmann
\end{document}
在评论中,Gustavo 添加了指向 Knuth 关于其工作原理的解释的指针,该解释位于 TeXbook 第 454 页:
Knuth 解释的关键在于“放弃连字(直到下一个粘合项之后)”如果“任何其他类型的项目都出现在合适的起始字母之前。” 因此,解决方案\hspace{0pt}
是添加一个“胶水物品”这将重新启动连字符搜索,并防止在姓氏之后和姓氏之前\nobreak
插入换行符,否则使用粘合项可能会发生这种情况。\,
答案2
史蒂文应该承担全部责任;我对这个问题增加了一些考虑。
姓名首字母和姓氏之间的分隔符似乎存在争议,您可能会被要求使用普通空格而不是细空格。
因此,最好定义一个宏来解决这个问题:只需改变其定义就会修改全局行为。
这里的宏;主要的宏有一个*
-form:我相信名称应该只作为最后的手段来使用连字符;如果特定名称出现问题,很容易更改\name{...}
为\name*{...}
。
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\setupnames}{m}
{
\keys_set:nn { fredfisch/name } { #1 }
}
\NewDocumentCommand{\name}{sm}
{
\IfBooleanTF{#1}
{
\keys_set:nn {fredfisch/name} { hyphen=true }
}
{
\keys_set:nn {fredfisch/name} { hyphen=false }
}
\fredfisch_name:n { #2 }
}
\keys_define:nn { fredfisch/name }
{
hyphen .bool_set:N = \l_fredfisch_name_hyphen_bool,
initials-sep .tl_set:N = \l_fredfisch_name_initials_sep_tl,
surname-sep .tl_set:N = \l_fredfisch_name_surname_sep_tl,
}
\seq_new:N \l_fredfisch_name_initials_seq
\tl_new:N \l_fredfisch_name_surname_tl
\cs_new_protected:Nn \fredfisch_name:n
{
\seq_set_split:Nnn \l_fredfisch_name_initials_seq { . } { #1 }
\seq_pop_right:NN \l_fredfisch_name_initials_seq \l_fredfisch_name_surname_tl
\seq_if_empty:NTF \l_fredfisch_name_initials_seq
{
\mode_if_horizontal:F { \leavevmode }
\kern0pt\nobreak\scan_stop:
}
{
\seq_use:Nn \l_fredfisch_name_initials_seq { . \l_fredfisch_name_initials_sep_tl }
.
\l_fredfisch_name_surname_sep_tl
\nobreak
}
\bool_if:NT \l_fredfisch_name_hyphen_bool { \hspace{0pt} }
\l_fredfisch_name_surname_tl
}
\ExplSyntaxOff
\hyphenation{Fug-mann}
\begin{document}
\setupnames{
initials-sep = {\,},
surname-sep = {\,},
}
\parbox{0pt}{
Start
Fugmann
\name{F. Fugmann}
\name*{F. Fugmann}
\name{P.A.M. Dirac}
}
\bigskip
\setupnames{
initials-sep={\,},
surname-sep={~},
}
\parbox{0pt}{
Start
Fugmann
\name{F. Fugmann}
\name*{F. Fugmann}
\name{P.A.M. Dirac}
}
\bigskip
\setupnames{
initials-sep={~},
surname-sep={~},
}
\parbox{0pt}{
Start
Fugmann
\name{F. Fugmann}
\name*{F. Fugmann}
\name{P.A.M. Dirac}
\name{Fugmann}
\name*{Fugmann}
}
\end{document}
请注意,无论您如何输入首字母,它们总是会被所选的空格分隔开。
一些解释。 参数\name
被分割在句点处,最后一部分被视为姓氏。然后提供首字母,用句点分隔,后跟所选分隔符;然后插入首字母和姓氏之间的分隔符(请注意,它可以与首字母之间的分隔符不同)以及\nobreak
;如果*
使用 -variant,我们还插入\hspace{0pt}
允许姓氏连字符的。
打字\name{Fugmann}
将不允许连字符,但*
-variant 将再次启用它。