当对名称使用不间断空格时使用连字符,例如“F.\,Fugmann”

当对名称使用不间断空格时使用连字符,例如“F.\,Fugmann”

我在缩写的名字和姓氏之间放置一个小的不间断空格,例如我写F.\,Fugmann。 (德国名字。)

我注意到F.\,Fugmann现在没有连字符,即使使用babel德语连字符模式并放入\hyphenation{Fug-mann}序言中。

由于这种行为会导致盒子过满(我目前通过编写进行调试)F.\,Fug\-mann,我开始怀疑:

  1. 有没有办法可以自动实现我想要的行为?

  2. 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 将再次启用它。

相关内容