我正在寻找一种方法来自动在数学模式下将某些字符加粗(对于向量和矩阵),但如果字符后跟下划线则不会。将普通字符替换为加粗字符只能在数学模式下进行。
理想情况下,代码
\DeclareVectors{abuvxyz}
\DeclareMatrices{ABM}
\DeclareBB{R}
$A\in R^{q\times n}$ is a matrix with entries $A_{ij}$ and
$v\in R^n$ is a vector with $n$ coordinates, i.e., $v=(v_1,...,v_n)$.
\DeclareVectors{abuvxyz}
\DeclareMatrices{ABM}
\DeclareBB{R}
或者是否存在提供所需行为的包。
最接近的解决方案似乎是如何自动将所有大写字母加粗?,尽管它没有提供像 那样的非粗体字母后跟下划线的解决方案v_1,...,v_n
。
一些备注:
- 目标是提高代码的可读性并尽可能减少代码开销。当然可以使用命令
\bm
等\boldsymbol
,但这不是目标。 - 为了减少打字负担,https://tex.stackexchange.com/a/45724/207532很有趣,但我希望解决方案可以更进一步,完全减少输入反斜杠的需要。
- 如果您希望文档中同时包含标量 V 和矩阵 V,该怎么办?这是一种权衡,如果存在如上所述的解决方案,您必须选择每个字母是粗体、正常还是 bb。
答案1
您很快就会后悔这样做,因为它相当不灵活。
\documentclass{article}
\usepackage{amsmath,amssymb}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\n}{m}
{
\cs_if_exist_use:cF { __jlewk_mathchar_#1: } { #1 }
}
\NewDocumentCommand{\DeclareVectors}{m}
{
\tl_map_function:nN { #1 } \jlewk_make_vector:n
}
\NewDocumentCommand{\DeclareMatrices}{m}
{
\tl_map_function:nN { #1 } \jlewk_make_matrix:n
}
\NewDocumentCommand{\DeclareNumbersets}{m}
{
\tl_map_function:nN { #1 } \jlewk_make_numberset:n
}
\cs_new_protected:Nn \jlewk_make_vector:n
{
\jlewk_make_check:Nn \mathbf { #1 }
}
\cs_new_protected:Nn \jlewk_make_matrix:n
{
\jlewk_make_check:Nn \mathsf { #1 }
}
\cs_new_protected:Nn \jlewk_make_numberset:n
{
\cs_new_protected:cn { __jlewk_char_#1: }
{
\mathbb { \use:c { __jlewk_mathchar_#1: } }
}
\exp_args:Nc \mathchardef { __jlewk_mathchar_#1: }=\char_value_mathcode:n {`#1}
\char_set_active_eq:Nc #1 { __jlewk_char_#1: }
\AtBeginDocument
{
\char_set_mathcode:nn { `#1 } { "8000 }
}
}
\cs_new_protected:Nn \jlewk_make_check:Nn
{
\cs_new_protected:cn { __jlewk_char_#2: } { \jlewk_check:Nn #1 { #2 } }
\exp_args:Nc \mathchardef { __jlewk_mathchar_#2: }=\char_value_mathcode:n {`#2}
\char_set_active_eq:Nc #2 { __jlewk_char_#2: }
\AtBeginDocument
{
\char_set_mathcode:nn { `#2 } { "8000 }
}
}
\cs_new_protected:Nn \jlewk_check:Nn
{
\peek_catcode:NTF \c_math_subscript_token
{
\use:c { __jlewk_mathchar_#2: }
}
{
#1 { \use:c { __jlewk_mathchar_#2: } }
}
}
\ExplSyntaxOff
\DeclareVectors{abuvxyz}
\DeclareMatrices{ABM}
\DeclareNumbersets{R}
\begin{document}
$v=(v_1,v_2,\dots,v_n)\in R^n$
$A$ is a matrix
$\n{A}$ is not a matrix, nor $\n{R}$ is a number set and $\n{v}$ is normal
\end{document}
您需要使字符数学处于活动状态,以便它通过数学代码输出自身,可能作为适当的字体更改命令的参数。
因此定义了许多与字符相关的函数。向量和矩阵使用以下检查_
。
你可以通过将其用作单身的的論點\n
。
答案2
鉴于您的目标是使源代码更具可读性,您可以将数学 Unicode 字符块中的符号粘贴到 UTF-8 源文件中。无需复制粘贴即可输入这些符号的有效方法是打开字符映射应用程序(例如charmap
在 Windows 或gnome-character-map
Linux 上)。
在带有 的现代工具链中unicode-math
,这就像许多其他东西一样有效。可以使用 来设置旧版工具链以支持此功能newunicodechar
。您可能会发现isomath
和mathalpha
可用于加载更多数学字母表。
\documentclass{book}
\usepackage{iftex}
\ifPDFTeX
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc} % The default since 2018.
\usepackage{amsmath, amssymb}
\usepackage{newunicodechar}
\newunicodechar{