假设我想要一个包含两种语言(泰语和英语)的 LaTeX 文档,每种语言使用不同的字体。假设我想要一种名为沙拉班·朱拉' 为泰语“拉丁现代罗马”(默认字体)保留为英语。通常,我会添加字体规格和多语包,然后将泰语设置为主要语言,并在下方添加英语作为附加语言\E字体; 如下:
\usepackage[no-math]{fontspec}
\setmainfont{TH Sarabun Chula}
\XeTeXlinebreaklocale "TH"
\XeTeXlinebreakskip = 0pt plus 1pt
\usepackage{polyglossia}
\setotherlanguages{english}
\newfontfamily\Efont{Latin Modern Roman}
这沙拉班·朱拉' 字体比拉丁现代罗马所以我下了命令\lm基于\E字体使英文字体变小,从而消除字体之间的大小差异。
\newcommand{\lm}[1]{
{\small{\Efont{#1}}}}
我的大部分文档都以泰语为主要语言;因此,每当我想使用英语环境时,我都会使用\lm命令,我得到了我想要的。以下是我的讲义中使用此命令的部分代码。
\begin{itemize}[noitemsep]
\item งาน \lm{(work)} คือการถ่ายโอนพลังงานที่ทำให้โมเลกุลเคลื่อนตัวอย่างเป็นระเบียบ
\item ความร้อน \lm{(heat)} คือการถ่ายโอนพลังงานที่ทำให้โมเลกุลเคลื่อนตัวอย่างไม่เป็นระเบียบ
\end{itemize}
สมมติว่าเราให้ความร้อนโดยต้มน้ำในหม้อจนเดือด จะสังเกตได้ว่าจะเกิดการสั่น เคลื่อนที่ไม่เป็นระเบียบ
นั่นแสดงว่าความร้อนได้กระตุ้นให้โมเลกุลของไอน้ำสั่นและเคลื่อนตัวไปมาอย่างไม่เป็นระเบียบ
เราอาจการเคลื่อนที่ดังกล่าวว่าเป็นการเคลื่อนที่ความร้อน \lm{(thermal motion)}
我可以继续用这种方法,但是写这篇文章太累了\lm{...}每次。我想知道是否有其他方法可以在两种(或多种)语言环境之间转换,而无需设置上述命令。(只需在正文中输入它们,它就会立即自动更改字体。)
我很感激任何提前提供的帮助。谢谢。
答案1
将来,请始终提供可编译的代码而不是代码片段。这样人们更容易提供帮助,并且答案更有可能适用于您的实际文档。
您可以缩放英语字体,这比依赖它更好,\small
因为它可以在不同大小下正确缩放。(\small
顺便说一下,不需要参数。)
但是,您仍然需要告诉 LaTeX 切换语言。这不仅仅是更改字体的问题。据我所知,polyglossia
无法自动检测到这一点,因此您需要暂时激活替代语言。您可以创建\lm
一个快捷方式,\textenglish{}
即由提供的宏polyglossia
来切换,但这并不意味着减少打字。
\documentclass[11pt,oneside,a4paper,titlepage]{article}
\usepackage[no-math]{fontspec}
\setmainfont{Noto Sans Thai}
\XeTeXlinebreaklocale "TH"
\XeTeXlinebreakskip = 0pt plus 1pt
\usepackage{polyglossia}
\setmainlanguage{thai}
\setotherlanguage[variant=american]{english}
\newfontfamily\englishfont{Latin Modern Roman}[Scale=MatchLowercase]
\NewCommandCopy \lm \textenglish
\begin{document}
\begin{itemize}
\item งาน \lm{(work)} คือการถ่ายโอนพลังงานที่ทำให้โมเลกุลเคลื่อนตัวอย่างเป็นระเบียบ
\item ความร้อน \lm{(heat)} คือการถ่ายโอนพลังงานที่ทำให้โมเลกุลเคลื่อนตัวอย่างไม่เป็นระเบียบ
\end{itemize}
\end{document}
为了减少输入,请在您选择的编辑器中创建一个组合键,这样您就不必\lm{}
每次都手动输入。更好的是,将其插入\textenglish{}
或以其他方式进行,这样您的代码就会更加透明,并且您的标记将更加语义化,而不是基于外观。
由于 Okular-on-X 错误,没有提供图像,但使用 Noto Sans Thai 和 LM 输出效果看起来很糟糕。(缺少泰语字符,粗细严重不匹配。)因此,代码纯粹是说明性的,而不是装饰性的。
答案2
您可以使用 Babel(或 Polyglossia,@cfr 已经发布过)来实现这一点。将 Babel 与 LuaLaTeX 结合使用的一个优点是它可以自动检测您输入的语言并相应地更改字体,而无需任何标签或环境。
此 MWE 还将所有字体缩放到相同的 x 高度,但您可以通过Scale=
在每个需要的字体前面添加一个选项来调整字体大小。我也加载了unicode-math
,但fontspec
其他数学包也可以正常工作。
\documentclass{article}
\tracinglostchars=3 % Make it an error for letters to be missing.
\usepackage{enumitem}
\usepackage{babel}
\usepackage{unicode-math}
\babelprovide[import, onchar=fonts ids]{english}
\babelprovide[import, main, onchar=fonts ids]{thai}
% TH Sarabun Chula is available from https://www.arts.chula.ac.th/ling/tag/ipa/
\defaultfontfeatures{Scale=MatchLowercase, Ligatures=TeX}
\babelfont{rm}
[Scale=1.0]{NewCM10-Regular}
\babelfont[thai]{rm}
{TH Sarabun Chula}
\setmathfont{NewCMMath-Regular.otf}
\begin{document}
\begin{itemize}[noitemsep]
\item งาน (work) คือการถ่ายโอนพลังงานที่ทำให้โมเลกุลเคลื่อนตัวอย่างเป็นระเบียบ
\item ความร้อน (heat) คือการถ่ายโอนพลังงานที่ทำให้โมเลกุลเคลื่อนตัวอย่างไม่เป็นระเบียบ
\end{itemize}
สมมติว่าเราให้ความร้อนโดยต้มน้ำในหม้อจนเดือด จะสังเกตได้ว่าจะเกิดการสั่น เคลื่อนที่ไม่เป็นระเบียบ
นั่นแสดงว่าความร้อนได้กระตุ้นให้โมเลกุลของไอน้ำสั่นและเคลื่อนตัวไปมาอย่างไม่เป็นระเบียบ
เราอาจการเคลื่อนที่ดังกล่าวว่าเป็นการเคลื่อนที่ความร้อน (thermal motion)
This line is in English.
\end{document}