我想在我的 LaTeX 文档中定义两个新的类定理环境,基于阿姆斯特丹包,为“示例”环境生成一个希伯来语标题,其中包含单词“דוגמה”(英语:示例),并为问题环境生成一个标题为“שאלה”(英语:问题)的问题环境。
我在网上发现,在这个网站上,一个可以做到这一点的 MWE,我希望您能帮助我理解其原因。
代码:
% !TEX TS-program = xelatex
% !TEX encoding = UTF-8 Unicode
\documentclass{article}
%\usepackage[utf8]{inputenc} % not needed since compiled with XeTeX
\usepackage{amsthm,amssymb,amsmath}
\usepackage{polyglossia}
\setdefaultlanguage[numerals=hebrew]{hebrew}
\setotherlanguage{english}
\usepackage{fontspec}
\newfontfamily\hebrewfont[Script=Hebrew]{Hadasim CLM}
\newfontfamily\hebrewfontsf[Script=Hebrew]{Miriam CLM}
\newfontfamily\hebrewfonttt[Script=Hebrew]{IBM Plex Sans Hebrew}
\newfontfamily{\englishfont}{Caladea}
\newfontfamily{\englishfontsf}{Parix}
\newfontfamily{\englishfonttt}{Merriweather}
%%% End of fonts
%%% Code downloaded from xitable
%\makeatletter
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Textclass specific LaTeX commands.
\theoremstyle{remark}
\newtheorem{question}{\protect\questionname}
\newtheorem{quesh}{שאלה}
\renewenvironment{question}{\begin{quesh}}{\end{quesh}}
\theoremstyle{definition}
\newtheorem{example}{\protect\examplename}
%\makeatother
\addto\captionsenglish{\renewcommand{\questionname}{Question}}
\addto\captionsenglish{\renewcommand{\examplename}{Example}}
\addto\captionshebrew{\renewcommand{\questionname}{שאלה}}
\addto\captionshebrew{\renewcommand{\examplename}{דוגמה}}
\providecommand{\questionname}{שאלה}
\providecommand{\examplename}{דוגמה}
\begin{document}
\section{שאלות לדיון}
\begin{english}
Some questions and examples at the end of the lecture.
\end{english}
\begin{quesh}
מהי פונקציה רציפה?
\end{quesh}
\begin{question}
מתי שני המספרים הרציונליים $\frac{a}{b}$ ו $\frac{c}{d}$ שווים זה לזה?
\end{question}
\begin{example}
$3+2\mathrm{i}$ הוא דוגמה למספר מרוכב.
\end{example}
\end{document}
笔记:
- 上述文档已在 Overleaf 中使用 XeLaTeX 成功编译。上述字体已安装在其 TeX 发行版中。
- 我故意没有为环境提供任何计数器,以使代码更加整洁。
我的问题是:
如你所见,对于问题,定义了两个环境。第一个是
question
,另一个是quesh
。这是否只是原始程序员编写的不良编码习惯?如果不是,那么为什么呢?是否真的需要将第一行代码插入到
\makeatletter
and中\makeatother
?我注释掉了两者,但在原始文件中它们没有被注释。\protect\questionname
或(通常)的作用是什么\protect\__environment__name
?我在哪里可以找到有关这些参数的文档?也许将来我还需要更改目录和附录标题。这些条目的语法是什么?是否可以用更少的 LaTeX 命令实现这个目标?
最重要的是,有人能描述出定义新环境的命令的“工作流程”或推理路线吗?
答案1
对于第 5 类问题的一个可能总是回答是“不多”(并且通常有多种方式可以实现这一点,大多数归结为“如果它运行,它就运行”的变体)。
无论如何,删除所有“非必要”代码可得到:
我所说的“非必要”是指我不知道该代码应该做什么或用于什么,因此它没有增加任何功能(我的印象是它是“累积”代码,例如,随着时间的推移不加批判地积累复制粘贴(并且可能有正当的理由))。
基本设置很清晰:
代码将希伯来语设置为主要语言,并定义了两个定理环境(quesh
和example
)。由于我不知道它还应该做什么(无法下载链接中的 .tex 文件来查找),我注释掉了那些多余的部分,看看它们有什么影响(我看不到任何影响)。
polyglossia
加载fontspec
,因此fontspec
实际上不需要再次加载。
我没有字体,所以我只是使用了一些随机的字体。
使用 lualatex 编译。
看起来还不错。
注意:tcolorbox
包在这个领域有专业知识并且可能有用(布局,格式,样式等)。
平均能量损失
\documentclass{article}
\usepackage{amsthm,amssymb,amsmath}
\usepackage{polyglossia}
\setdefaultlanguage[numerals=hebrew]{hebrew}
\setotherlanguage{english}
%\usepackage{fontspec}
\newfontfamily\hebrewfont[Script=Hebrew]{David Libre}%{Hadasim CLM}
\newfontfamily\hebrewfontsf[Script=Hebrew]{FreeSans}%{Miriam CLM}
\newfontfamily\hebrewfonttt[Script=Hebrew]{FreeMono}%{IBM Plex Sans Hebrew}
\newfontfamily{\englishfont}{Noto Serif}%{Caladea}
%\newfontfamily{\englishfontsf}{Parix}
%\newfontfamily{\englishfonttt}{Merriweather}
%%% End of fonts
%%% Code downloaded from xitable
%\makeatletter
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Textclass specific LaTeX commands.
\theoremstyle{remark}
%\newtheorem{question}{\protect\questionname}
\newtheorem{quesh}{שאלה}
%\renewenvironment{question}{\begin{quesh}}{\end{quesh}}
%\newenvironment{question}{\begin{quesh}}{\end{quesh}}
\theoremstyle{definition}
\newtheorem{example}{דוגמה}%{\protect\examplename}
%\makeatother
% \addto\captionsenglish{\renewcommand{\questionname}{Question}}
% \addto\captionsenglish{\renewcommand{\examplename}{Example}}
% \addto\captionshebrew{\renewcommand{\questionname}{שאלה}}
% \addto\captionshebrew{\renewcommand{\examplename}{דוגמה}}
%% \providecommand{\questionname}{שאלה}
%% \providecommand{\examplename}{דוגמה}
\begin{document}
\section{שאלות לדיון}
\begin{english}
Some questions and examples at the end of the lecture.
\end{english}
\begin{quesh}
מהי פונקציה רציפה?
\end{quesh}
\begin{quesh}
מתי שני המספרים הרציונליים $\frac{a}{b}$ ו $\frac{c}{d}$ שווים זה לזה?
\end{quesh}
\begin{example}
$3+2\mathrm{i}$ הוא דוגמה למספר מרוכב.
\end{example}
\begin{example}
$1+1$ הוא דוגמה למספר מרוכב.
\begin{english}Some more instructions.\end{english}
\end{example}
\end{document}
polyglossia
有语言定义文件。如果你查看里面gloss-hebrew.ldf
,你会看到:
\def\captionshebrew{%
\def\prefacename{מבוא}%
\def\refname{מקורות}%
\def\abstractname{תקציר}%
\def\bibname{ביבליוגרפיה}%
\def\chaptername{פרק}%
...
该\addto\captionshebrew
部分专为用户添加到此列表而设计(另一种方法是直接将行添加到 .ldf 文件),使处理/编码更加系统化。这取决于您想要做什么以及您想要如何解决它。
更新 1
关于评论中的问题:对于自动翻译(除了 Davislor 的解决方案),使用变量名作为环境的标签/标题,并将翻译文本添加到两种语言标题集中。
将标签(例如xyz
)定义为变量(例如\xyzname
):
\newcommand{\xyzname}{XYZName}
xyz
使用该标签变量名定义一个新的定理环境:
\newtheorem{xyz}{\xyzname}
现在,告诉我们polyglossia
在改变语言时要将变量设置为何值:
\addto\captionsenglish{\renewcommand{\xyzname}{XYZ}}
\addto\captionshebrew{\renewcommand{\xyzname}{רשת}}
用法:
\begin{xyz}
רשת
\end{xyz}
注意:这样做\setdefaultlanguage[numerals=hebrew]{hebrew}
会将所有内容的数字设置为希伯来语;如果不使用选项(即 \setdefaultlanguage{hebrew}
),它看起来像这样:
平均能量损失
\documentclass{article}
\usepackage{amsthm,amssymb,amsmath}
\usepackage{polyglossia}
\setdefaultlanguage{hebrew}
\setotherlanguage{english}
\newfontfamily\hebrewfont[Script=Hebrew]{David Libre}%{Hadasim CLM}
\newfontfamily\hebrewfontsf[Script=Hebrew]{FreeSans}%{Miriam CLM}
\newfontfamily\hebrewfonttt[Script=Hebrew]{FreeMono}%{IBM Plex Sans Hebrew}
\newfontfamily{\englishfont}[Colour=blue]{Noto Serif}%{Caladea}
\theoremstyle{definition}
\newcommand{\xyzname}{XYZName}
\newtheorem{xyz}{\xyzname}
\addto\captionsenglish{\renewcommand{\xyzname}{XYZ}}
\addto\captionshebrew{\renewcommand{\xyzname}{רשת}}
\begin{document}
עברית:
\begin{xyz}
רשת
\end{xyz}
%====================
\begin{english}
English:
\begin{xyz}
xxx
\end{xyz}
\end{english}
\end{document}
更新 1.a
定理编号
定义一个定理环境也会定义相应的定理数变量,该变量可以添加到标题列表中 - 在这种情况下,polyglossia
的希伯来语模块提供了一个\hebrewnumeral{}
功能。
定理环境xyz
有一个计数器xyz
,其可打印版本\thexyz
可以在使用以下命令转换后添加到希伯来语标题中\hebrewnumeral{\value{xyz}}
:
\addto\captionshebrew{\renewcommand{\thexyz}{\hebrewnumeral{\value{xyz}}}}
平均能量损失
\documentclass{article}
\usepackage{amsthm,amssymb,amsmath}
\usepackage{polyglossia}
\setotherlanguage{english}
\setotherlanguage{hebrew}
\newfontfamily\hebrewfont[Script=Hebrew]{David Libre}%{Hadasim CLM}
\newfontfamily\hebrewfontsf[Script=Hebrew]{FreeSans}%{Miriam CLM}
\newfontfamily\hebrewfonttt[Script=Hebrew]{FreeMono}%{IBM Plex Sans Hebrew}
\newfontfamily{\englishfont}[Colour=blue]{Noto Serif}%{Caladea}
\theoremstyle{definition}
\newcommand{\xyzname}{XYZName}
\newtheorem{xyz}{\xyzname}
\addto\captionsenglish{\renewcommand{\xyzname}{XYZ}}
\addto\captionshebrew{\renewcommand{\xyzname}{רשת}}
\addto\captionshebrew{\renewcommand{\thexyz}{\hebrewnumeral{\value{xyz}}}}
\begin{document}
%---
\begin{hebrew}
עברית:
\begin{xyz}
רשת
\end{xyz}
\end{hebrew}
%====================
\begin{english}
English:
\begin{xyz}
xxx
\end{xyz}
\end{english}
%---
\begin{hebrew}
עברית:
\begin{xyz}
רשת
\end{xyz}
\end{hebrew}
%====================
\begin{english}
English:
\begin{xyz}
xxx
\end{xyz}
\end{english}
%---
\begin{hebrew}
עברית:
\begin{xyz}
רשת
\end{xyz}
\end{hebrew}
%====================
\begin{english}
English:
\begin{xyz}
xxx
\end{xyz}
\end{english}
\end{document}
答案2
我没有调查过您链接的网站,但我认为即使没有调查过也可以合理地尝试解答您的问题。
一个关键的考虑因素是显然要制作一份多语言文档,而不是仅使用一种语言的文档。
如你所见,对于问题,定义了两个环境。第一个是
question
,另一个是quesh
。这是否只是原始程序员编写的不良编码习惯?如果不是,那么为什么呢?
我认为这是在尝试允许使用希伯来语和英语提问。为不同的语言元素设置不同的环境是有意义的。不清楚的是试图将它们等同起来;还有其他更好的方法来处理这些差异。
是否真的需要将第一行代码插入到
\makeatletter
and中\makeatother
?我注释掉了两者,但在原始文件中它们没有被注释。
\makeatletter
并且\makeatother
仅当相关范围内的命令名称包含符号时才需要@
。此处未@
使用符号,因此它们是不必要的,最好省略以避免混淆。
\protect\questionname
或(通常)的作用是什么\protect\__environment__name
?我在哪里可以找到有关这些参数的文档?也许将来我还需要更改目录和附录标题。这些条目的语法是什么?
在某些情况下,当命令名称指定的字符串被重新用于其他目的(例如在运行头或目录中)时,需要防止过早扩展该用途,因为这可能会导致它在最终输出中被错误地呈现。这就是 的功能\protect
。
是否可以用更少的 LaTeX 命令实现这个目标?
我相信这应该是可能的。使用时amsthm
,我只需为\newtheoremstyle
要以替代语言呈现的元素定义一个,强制所需语言成为环境定义的一部分,然后使用它来定义具有不同名称的另一个环境。如何定义一个在用户指南()\newtheoremstyle
中描述。amsthm
texdoc amsthdoc
(La)TeX 有许多有趣的功能,但其中不包括从一种语言到另一种语言的自动翻译;在撰写文档时,作者几乎肯定知道特定段落使用的是哪种语言。
最重要的是,有人能描述出定义新环境的命令的“工作流程”或推理路线吗?
除了希望在看似平行的环境中使用两种不同的语言之外,我无法弄清楚为什么要以所示的方式定义这些环境。
当然,我可能完全误解了情况,在这种情况下,我会很乐意删除这个答案。
答案3
您在这里提出了许多问题,但其他答案尚未解决的一个问题是,可以编写一个可以自动改变语言的单一定理环境。 这是我前段时间针对希伯来语和英语所做的事情。