在單字中間切換字體系列或顏色時遺失連字

在單字中間切換字體系列或顏色時遺失連字

出於教學目的,我想透過粗體或紅色或任何可行的顏色來突出顯示單字中的某些字元。

因為我使用手寫字體(德語 Schulschriftenwedn和法語草書frcursive),所以我必須使用連字才能正常工作。不幸的是,如果您在單字中間切換系列或顏色,連字將被阻止。

我會對 XeLaTeX 或 LuaLaTeX 解決方案感到滿意。如果需要,也可以使用 PDFLaTeX 解決方案。正如所說,任何類型的突出顯示都可以。

這裡是 MWE:

\documentclass[varwidth]{standalone}
\usepackage[ngerman,frenchb]{babel}
\usepackage{fontspec}
\setmainfont{Linux Libertine O}
\setmonofont[Scale=.75]{Linux Libertine Mono O}
\setsansfont[Scale=MatchLowercase]{Linux Biolinum O}
\usepackage{wedn}
\newcommand{\schschrift}{\selectlanguage{ngerman} \wedn\upshape}
\usepackage{frcursive}    
\usepackage{xcolor}

\begin{document}
\newcommand{\fex}[3]{#1\textbf{#2}#3}
% \renewcommand{\fex}[3]{#1{\bfseries #2}#3}

{
\schschrift
\fex{W}{ö}{rter} -- Wörter
}
{
\cursive
\fex{incr}{oy}{able} -- incroyable
}

\renewcommand{\fex}[3]{#1\textcolor{red}{#2}#3}

{
\schschrift
\fex{W}{ö}{rter} -- Wörter
}
{
\cursive
\fex{incr}{oy}{able} -- incroyable
}

\renewcommand{\fex}[3]{#1#2#3}

{
\schschrift
\fex{W}{ö}{rter} -- Wörter
}
{
\cursive
\fex{incr}{oy}{able} -- incroyable
}
\end{document}

您可以看到,在前 2 行中,當以粗體或紅色顯示時,W 和 ö 以及 r、o + y 和 a 結合得不好。與非突出顯示的版本進行比較。 連字被阻止

答案1

您可以嘗試 luacolor 套件。它不會插入任何內容,因此不會分開連字或擾亂字距調整。但它不能將連字的一部分著色為與其餘部分不同的顏色。連字是單一字形,且必須具有單一顏色。所以你可以得到非常令人驚訝的結果(最後一個例子可能是一個錯誤):

\documentclass{article}
\usepackage[ngerman,french]{babel}
\usepackage{fontspec}
\setmainfont{Linux Libertine O}
\setmonofont[Scale=.75]{Linux Libertine Mono O}
\setsansfont[Scale=MatchLowercase]{Linux Biolinum O}
\usepackage{wedn}
\newcommand{\schschrift}{\selectlanguage{ngerman} \wedn\upshape}
\usepackage{frcursive}
\usepackage{xcolor}
\usepackage{luacolor}
\begin{document}

fi\textcolor{red}{ff}

f\textcolor{red}{if}f

\newcommand{\fex}[3]{#1\textcolor{red}{#2}#3}

{
\schschrift
W\textcolor{red}{ö}rter -- Wörter 
}

{\cursive i\textcolor{red}{croy} in\textcolor{red}{croy}
i\textcolor{red}{nc}roy}
\end{document}

小心你的特殊字體:T1 編碼不太適合 lualatex(至少字體似乎使用非標準 T1 編碼)。

在此輸入影像描述

答案2

我想出了一個使用背景顏色的解決方案。

基本上,它會將單字列印兩次。這是透過\rlap第一次列印來實現的(不要忘記\leavevmode 在段落的開頭,或\mbox[0pt]{l}{...}交替使用)。第一個列印將第一部分列印為 \hphantom,然後以灰色列印第二部分(突出顯示的部分)。之後,第二次列印將整個單字以正常前景色列印在其頂部,以便中間部分以前景色顯示在灰色背景之上。由於連字的存在或不存在會改變單字(或單字部分)的寬度,因此必須透過一些字距調整來手動調整兩個版本之間的對齊方式。

\documentclass[varwidth,landscape]{standalone}
\usepackage[ngerman,frenchb]{babel}
\usepackage{fontspec}
\setmainfont{Linux Libertine O}

\usepackage{frcursive}
\usepackage{wela,wedn}
\newcommand{\schschrift}{\wedn\upshape\bfseries}

\usepackage{xcolor}

\definecolor{FR}{rgb}{.2717,.4566,.2717}
\definecolor{DE}{rgb}{.4566,.2717,.2717}
\definecolor{fond}{gray}{.8}
\setlength{\fboxsep}{.1pt}

\begin{document}    
{
\cursive\color{FR}

\leavevmode\rlap{%
  \hphantom{pa}\kern-.3ex%
  \colorbox{fond}{\textcolor{fond}{tt}}%
  }%
  patte

\leavevmode\rlap{%
  \hphantom{incr}\kern-.3ex%
  \colorbox{fond}{\textcolor{fond}{oy}}%
  }%
  incroyable
}
}

{
\selectlanguage{ngerman}\schschrift\color{DE}

\leavevmode\rlap{%
  \hphantom{W}%
  \colorbox{fond}{\textcolor{fond}{ö}}%
  }Wörter

\renewcommand{\schschrift}{\wela\upshape\bfseries}\schschrift\color{DE}

\leavevmode\rlap{%
  \hphantom{W}\kern-.3ex%
  \colorbox{fond}{\textcolor{fond}{ö}}%
  }Wörter
}
\end{document}

螢幕截圖:

在此輸入影像描述

仍然存在一個問題:當字形超出其邊界框時,它可能看起來很奇怪,請參見第一個字形的 <ö>沃特。但我現在很高興,不會就這個小問題提出新問題。

編輯:

謝謝這個答案,我可以用正確尺寸的規則替換背景\colorbox及其小問題(需要包calc):

\leavevmode\rlap{%
  \hphantom{W}\kern-.3ex%
  \textcolor{fond}{\rule[\depthof{ö}*{-1}]{\widthof{ö}}{\totalheightof{ö}}}%
  }%
Wörter

在此輸入影像描述

相關內容