为数学公式编写可读的 LaTeX 代码

为数学公式编写可读的 LaTeX 代码

假设我有以下 LaTeX 代码

\subsection{Convex sets}
A set \( \mathcal{S} \)
in \( \mathbb{R}^n \)
is said to be convex if 
\[ \mathbf{x}_1, \mathbf{x}_2 \in \mathcal{S} \implies \lambda \mathbf{x}_1 +
(1-\lambda) \mathbf{x}_2 \in \mathcal{S} \text{~~~for all~~~} 0 < \lambda < 1 \]

我发现,即使像这样在每个内联数学环境后都添加一个新行,一段时间后它也会变得非常难以阅读。我发现对于充满数学的文本,通常很难生成可读的代码。

是否有一些最佳实践可以让你在 LaTeX 中编写出更易读的数学公式?

我有类似 LyX 的东西,但可以编写纯 LaTeX 并在编辑器中处理命令。比如,如果我写,\textbf{b}那么 b 将显示为粗体,并且该\textbf{}部分会消失。当我将鼠标悬停在 b 上或将光标放在 b 后面时,它会\textbf{}再次显示。也许 LyX 可以做到这一点?

答案1

我所说的大部分内容已在其他答案中涉及,但我将在这里写下我的想法。

首先,如果你经常用 LaTeX 格式编写代码,我认为你应该放弃 LyX,转而使用任何纯文本编辑器。在不久的将来,你的阅读和编写代码的速度会更快。

关于编写可读性强的代码。以下是一些使代码可读性的技巧:

  • 我发现 LaTeX 的主要功能之一是您可以随心所欲地书写。但不要搞砸了!我的意思是,在您的代码中,您(不应该)不想使用x粗体(mathbf),而必须x使用矢量(\vec{x})。您稍后会决定矢量是什么样子,但一开始,您不必为此担心。
  • 接下来,如果您通常定义一些集合,则可以定义\set命令(稍后您会担心集合如何显示),但是,正如 David Carlisle 指出的那样,您可以定义更短的命令。
  • 这是我的文档中必须有的:()定义实数。它是一个实体,所以我定义了一个命令来调用它们。但我不会定义\R,因为这样你就写不出你想要的东西了,你只是在固定你的代码输入(不应该这样做)。\mathbb{R}\Rn\mathbb{R}^n
  • 对于您来说可能\quad不太容易阅读,但我认为将来会容易阅读。
  • 这个例子不太长,所以你看不出缩进代码如何有利于阅读代码,但事实确实如此。
  • 我使用\[\]但我不使用\(和 ,\)因为我不太擅长阅读这些分隔符之间的数学。所以我将它们改为$
  • 就我个人而言,我不会在代码中写注释,除非我稍后需要编辑它或做其他事情(我使用注释作为提醒)。如果你读代码很快,你就不需要注释来解释你在做什么(就我而言,它们会分散我的注意力)。

我编写代码的方式如下:

\documentclass{article}
\usepackage{mathtools}
\usepackage{amsfonts}

\renewcommand\vec[1]{\mathbf{#1}}
\newcommand\set[1]{\mathcal{#1}}
\newcommand\R{\mathbb{R}}

\begin{document}
\subsection{Convex sets}
A set $\set{S}$ in $\R^n$ is said to be convex if 
\[
    \vec{x}_1, \vec{x}_2 \in \set{S} \implies \lambda \vec{x}_1 + (1-\lambda) \vec{x}_2 \in \set{S} \quad \text{for all } 0 < \lambda < 1 
\]
\end{document}

之后,我认为你应该区分编写代码和加快输入速度。大多数人定义命令是为了更快地编写代码(例如\newcommand\vx{\vec x}Niel de Beaudrap 的命令)。我不同意这一点。为了更快地编写代码,你应该使用允许你创建代码片段的编辑器(或第三方应用程序)(例如,我会创建一个在\vec{x}你输入时调用的代码片段vx)。

最后,为了加快代码阅读速度,您必须使用一个用颜色显示代码的程序(一种颜色表示数学,一种颜色表示命令,一种颜色表示文本,...)。这是我的代码示例(我在此处显示的主题和字体不是通常的,但我不在我的主操作系统中,但我并不讨厌这种设置): 在此处输入图片描述

概括

以下是我的想法:

  1. 写下你想要的(但不要误解你真正想要的)。你使用的命令必须是实体,而不仅仅是‘捷径’。稍后,你会关心它看起来是什么样子。
  2. 不要使用命令作为片段(使用好的编辑器或第三方应用程序来使用片段)。
  3. 缩进你的代码。
  4. 使用以不同颜色显示代码的编辑器。
  5. 再次强调,如果您希望代码可读性强,请不要使用\mathbf{x} \in \mathbb{R}^n\vx \in \Rn。我会选择\vec{x} \in \R^n

答案2

可能有一些编辑器可以进行您所描述的那种文本替换(您示例中的 emacs 已经将部分标题设置为不同的字体,尽管它没有隐藏标记\subsection,但显然可以给出足够的 lisp 定义)。

也许我只是一个老卢德分子,但我发现编辑器中的字体变化令人分心,当然,如果编辑器开始隐藏标记,简单的事情似乎更简单,但对于任何更复杂的事情,或者如果事情开始出错,它会让事情更难理解,因为你永远不确定你所看到的是否是实际正在处理的内容。

可以提供帮助的是为标记赋予更多语义相关的名称,以便阅读起来更自然。在这里,我认为您使用书法来表示集合,使用黑板粗体来表示常见的数字字段,使用直立粗体(我自己更喜欢粗体数学斜体)来表示向量。因此,经过一些简单的定义,例如

\newcommand\sets{\mathcal}
\newcommand\R{\mathbb{R}}
\newcommand\V{\mathbf}

你可能有一个更易读的来源

\subsection{Convex sets}
A set \( \sets{S} \)
in \( \R^n \)
is said to be convex if 
\[ \V{x}_1, \V{x}_2 \in \sets{S} \implies \lambda \V{x}_1 +
(1-\lambda) \V{x}_2 \in \sets{S} \text{~~~for all~~~} 0 < \lambda < 1 \]

当然,还有很多变体,如果您没有太多的集合,您可以定义\S\mathcal{S}并使用\S而不是\sets{S}或任何您认为最自然的集合。

答案3

除了 David 的回答之外,您还可以将 unicode 与 Luatex 结合使用,以使代码更具可读性。我知道这很难输入,因此并不适合所有人,但我想展示什么是可能的:

\documentclass{article}

\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{unicode-math}

\setmathfont{Asana Math}

\newcommand\set{\mathcal}
\renewcommand\vec{\mathbf}

\begin{document}

A set \( \set{S} \) in \( ℝ^n \) is said to be convex if 
\[ \vec{x}_1, \vec{x}_2 ∈ \set{S} ⇒ λ \vec{x}_1 + (1-λ) \vec{x}_2 ∈ \set{S} 
    \text{~~~for all~~~} 0 < λ < 1 \]
\end{document}

编辑:正如指出的那样,粗体 x 是 U+1D431

答案4

我做一个很多我早期的草稿都是用 LaTeX 写的,所以我非常重视能够快速阅读自己的 LaTeX 代码。

因此,我采用了一种介于“LaTeX 方式”(使用正确的分隔符表示数学环境,使用语义名称表示宏)和快速而粗略的宏用法(不仅节省击键次数,还节省重新读取的字符)之间的风格。以下是我呈现代码段的典型方式。

% In the pre-amble
% ====================

% A semantic command for vectors
\renewcommand\vec[1]{\mathbf{#1}}

% A syntactic command for special symbols which I would
% consistently use for a given purpose.
\newcommand\R{\mathbb{R}}
\newcommand\cS{\mathcal{S}}

% In the document body
% ====================

\subsection{Convex sets}

A set $\cS$ in $\R^n$ is said to be \emph{convex} if
\begin{align}
  \vec x_1, \vec x_2, \in \cS
  &\implies
  \lambda \vec x_1 + (1-\lambda) \vec x_2 \in \cS
  &
  \text{for all $0 < \lambda < 1$.}
\end{align}

我不会费心在句子中间添加换行符,除非是脚注和行尾(如果您使用内容修订系统来跟踪更改,这样做很有用)。但我在显示的数学中随意添加它们,以更好地展示我正在编写的内容的结构,尤其是在制表环境中,例如align。您也可以直接使用equation环境,在这种情况下我会写:

\begin{equation}
  \vec x_1, \vec x_2, \in \cS
  \implies
  \lambda \vec x_1 + (1-\lambda) \vec x_2 \in \cS
  \quad
  \text{for all $0 < \lambda < 1$.}
\end{equation}

关于我定义宏的方法的进一步评论:

  • 如果你的文本中只有几个向量,你可以通过定义

    \newcommand\vx{\vec x}
    

    加快你(或你的合作者)的个人词汇分析过程;这会如何影响一个人的能力解析数学是另一回事。与 一样\cS,这种命名约定取决于读者(很可能只是你,但也包括任何合作者)习惯于将宏的名称解析为形容词-名词对:“书法 S”、“向量 x”等等。

  • 至于\R,这种命名约定应该只用于单一风格全部在您的文档中寻找代表非常重要的对象的符号(例如,黑板上粗体符号表示您可能在任何给定的论文中引用的数字集)。

请谨慎使用此类快捷方式,这不仅是为了您自己,也是为了与您一起处理该文档的同事的安全。

相关内容