帮助理解定义希伯来语环境的命令列表

帮助理解定义希伯来语环境的命令列表

我想在我的 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 发行版中。
  • 我故意没有为环境提供任何计数器,以使代码更加整洁。

我的问题是:

  1. 如你所见,对于问题,定义了两个环境。第一个是question,另一个是quesh。这是否只是原始程序员编写的不良编码习惯?如果不是,那么为什么呢?

  2. 是否真的需要将第一行代码插入到\makeatletterand中\makeatother?我注释掉了两者,但在原始文件中它们没有被注释。

  3. \protect\questionname或(通常)的作用是什么\protect\__environment__name?我在哪里可以找到有关这些参数的文档?也许将来我还需要更改目录和附录标题。这些条目的语法是什么?

  4. 是否可以用更少的 LaTeX 命令实现这个目标?

  5. 最重要的是,有人能描述出定义新环境的命令的“工作流程”或推理路线吗?

答案1

对于第 5 类问题的一个可能总是回答是“不多”(并且通常有多种方式可以实现这一点,大多数归结为“如果它运行,它就运行”的变体)。

无论如何,删除所有“非必要”代码可得到:

奎什

我所说的“非必要”是指我不知道该代码应该做什么或用于什么,因此它没有增加任何功能(我的印象是它是“累积”代码,例如,随着时间的推移不加批判地积累复制粘贴(并且可能有正当的理由))。

基本设置很清晰:

代码将希伯来语设置为主要语言,并定义了两个定理环境(queshexample)。由于我不知道它还应该做什么(无法​​下载链接中的 .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。这是否只是原始程序员编写的不良编码习惯?如果不是,那么为什么呢?

我认为这是在尝试允许使用希伯来语和英语提问。为不同的语言元素设置不同的环境是有意义的。不清楚的是试图将它们等同起来;还有其他更好的方法来处理这些差异。

是否真的需要将第一行代码插入到\makeatletterand中\makeatother?我注释掉了两者,但在原始文件中它们没有被注释。

\makeatletter并且\makeatother仅当相关范围内的命令名称包含符号时​​才需要@。此处未@使用符号,因此它们是不必要的,最好省略以避免混淆。

\protect\questionname或(通常)的作用是什么\protect\__environment__name?我在哪里可以找到有关这些参数的文档?也许将来我还需要更改目录和附录标题。这些条目的语法是什么?

在某些情况下,当命令名称指定的字符串被重新用于其他目的(例如在运行头或目录中)时,需要防止过早扩展该用途,因为这可能会导致它在最终输出中被错误地呈现。这就是 的功能\protect

是否可以用更少的 LaTeX 命令实现这个目标?

我相信这应该是可能的。使用时amsthm,我只需为\newtheoremstyle要以替代语言呈现的元素定义一个,强制所需语言成为环境定义的一部分,然后使用它来定义具有不同名称的另一个环境。如何定义一个在用户指南()\newtheoremstyle中描述。amsthmtexdoc amsthdoc

(La)TeX 有许多有趣的功能,但其中不包括从一种语言到另一种语言的自动翻译;在撰写文档时,作者几乎肯定知道特定段落使用的是哪种语言。

最重要的是,有人能描述出定义新环境的命令的“工作流程”或推理路线吗?

除了希望在看似平行的环境中使用两种不同的语言之外,我无法弄清楚为什么要以所示的方式定义这些环境。

当然,我可能完全误解了情况,在这种情况下,我会很乐意删除这个答案。

答案3

您在这里提出了许多问题,但其他答案尚未解决的一个问题是,可以编写一个可以自动改变语言的单一定理环境。 这是我前段时间针对希伯来语和英语所做的事情。

相关内容