为什么在第二个棺材中使用 \selectlanguage 而不是 \foreignlanguage (TL 2017)时会得到不同的对齐方式?

为什么在第二个棺材中使用 \selectlanguage 而不是 \foreignlanguage (TL 2017)时会得到不同的对齐方式?

为什么在下面的例子中,当我使用\selectlanguage而不是 时,会得到不同的对齐方式\foreignlanguage?由于 TeX Live 2016 中的 Babel 错误,存在间距问题。但是,该问题已在 TeX Live 2017 中得到修复,因此我认为这是一个不同的问题。

我认为我可以使用minipages 而不是coffins 来复制此操作。但是,我最初尝试这样做没有成功,所以这里有一个coffin版本,它至少简化了检查引入虚假空格的过程!

\documentclass[welsh,british]{article}
\usepackage{babel,expl3}
\begin{document}
\ExplSyntaxOn
\coffin_new:N \l_prawf_prif_coffin
\coffin_new:N \l_prawf_tmpa_coffin
\vcoffin_set:Nnn \l_prawf_prif_coffin { \textwidth }
{
  \vcoffin_set:Nnn \l_prawf_tmpa_coffin { \textwidth }
  {
    \mbox{}
  }
  \vcoffin_set:Nnn \l_tmpb_coffin { .5\textwidth - .5\columnsep }
  {
    A~rainbow:~red,~orange,~yellow,~green,~blue~\dots
    \skip_vertical:n \medskipamount
    \par
  }
  \vcoffin_set:Nnn \l_tmpa_coffin { .5\textwidth - .5\columnsep }
  {
    {
      \selectlanguage{welsh}
      Enfys:~coch,~oren,~melyn,~gwyrdd,~glas~\dots
    }
    \skip_vertical:n \medskipamount
    \par
  }
  \coffin_join:NnnNnnnn \l_prawf_tmpa_coffin { T } { r } \l_tmpa_coffin { T } { r } { 0pt } { 0pt }
  \coffin_join:NnnNnnnn \l_prawf_tmpa_coffin { T } { l } \l_tmpb_coffin { T } { l } { 0pt } { 0pt }
  \coffin_typeset:Nnnnn \l_prawf_tmpa_coffin { T } { l } { 0pt } { 0pt }
}
\coffin_typeset:Nnnnn \l_prawf_prif_coffin { T } { l } { 0pt } { 0pt }
\par

\vcoffin_set:Nnn \l_prawf_prif_coffin { \textwidth }
{
  \vcoffin_set:Nnn \l_prawf_tmpa_coffin { \textwidth }
  {
    \mbox{}
  }
  \vcoffin_set:Nnn \l_tmpb_coffin { .5\textwidth - .5\columnsep }
  {
    A~rainbow:~red,~orange,~yellow,~green,~blue~\dots
    \skip_vertical:n \medskipamount
    \par
  }
  \vcoffin_set:Nnn \l_tmpa_coffin { .5\textwidth - .5\columnsep }
  {
    \foreignlanguage{welsh}
    {
      Enfys:~coch,~oren,~melyn,~gwyrdd,~glas~\dots
    }
    \skip_vertical:n \medskipamount
    \par
  }
  \coffin_join:NnnNnnnn \l_prawf_tmpa_coffin { T } { r } \l_tmpa_coffin { T } { r } { 0pt } { 0pt }
  \coffin_join:NnnNnnnn \l_prawf_tmpa_coffin { T } { l } \l_tmpb_coffin { T } { l } { 0pt } { 0pt }
  \coffin_typeset:Nnnnn \l_prawf_tmpa_coffin { T } { l } { 0pt } { 0pt }
}
\coffin_typeset:Nnnnn \l_prawf_prif_coffin { T } { l } { 0pt } { 0pt }
\ExplSyntaxOff

\end{document}

错位的彩虹

答案1

问题是\selectlanguage插入的特殊内容。它旨在切换“整个”语言,因此添加到tocETC。

...........\write1{\select@language{welsh}}
...........\write1{\@writefile{toc}{\select@language{welsh}}}
...........\write1{\@writefile{lof}{\select@language{welsh}}}
...........\write1{\@writefile{lot}{\select@language{welsh}}}

(来自\showoutput)。另一方面,\foreignlanguage不这样做:它仅适用于“本地”更改。这有所不同,因为\write框开头的节点意味着我们无法“看到”第一行文本的基线:节点\write是参考点,它位于文本的顶部。

这是 TeX 中的一个“已知问题”,最明显的是颜色特效。LaTeX3xgalley方法可以通过仔细管理所有此类操作来解决此问题,但目前它无法与绝大多数 LaTeX2e 软件包“很好地配合”。因此,目前您需要在框顶部使用避免此类开关。

答案2

在 ConTeXt 中,本地语言开关与框架配合得很好(ConTeXt 相当于棺材)。遗憾的是,没有威尔士语的语言设置。以下是英语和德语的示例。

我选择了这样的列宽,即一旦删除就会显示过满的框\language[de]

\definefontfeature
  [default][default]
  [
    protrusion=quality,
    expansion=quality,
  ]

\starttext

\dontleavehmode
\startframed[location=top,width=.46\textwidth,align={justified,hz,hanging}]
  \language[en]%
  \input knuth
\stopframed
\hskip.08\textwidth
\startframed[location=top,width=.46\textwidth,align={justified,hz,hanging}]
  \language[de]%
  \blank[-line]% Compensate the blank line in aesop-de
  \input aesop-de
\stopframed

\stoptext

在此处输入图片描述

相关内容