为什么在下面的例子中,当我使用\selectlanguage
而不是 时,会得到不同的对齐方式\foreignlanguage
?由于 TeX Live 2016 中的 Babel 错误,存在间距问题。但是,该问题已在 TeX Live 2017 中得到修复,因此我认为这是一个不同的问题。
我认为我可以使用minipage
s 而不是coffin
s 来复制此操作。但是,我最初尝试这样做没有成功,所以这里有一个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
插入的特殊内容。它旨在切换“整个”语言,因此添加到toc
,ETC。:
...........\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