
我第一次访问 TeX.SX 是为了寻找一个符号扭纹产品:
我知道解毒和全面的 LaTeX 符号列表,但我找不到符号。我尝试了对我来说显而易见的构造,即\overset{\scriptstyle \sim}{\times}
,但\sim
太高了。我谷歌了一下,找到了@Hendrik Vogt 的解决方案。因此我了解了\smash
。
后来我需要在下标中使用相同的符号,最终学习了\mathchoice
和\ooalign
。从那时起,我发现 TeX.SX 上的许多问题都需要类似的技术。我认为最好有一个问题,其答案为具有一定 LaTeX 技能的访问者提供有关使用 LaTeX 和相关系统构造新符号的一般指导。
那么,当 Detexify 失败时,如何制作自己的符号?
答案1
如果确实不在 Detexify 中,请检查全面的 LaTeX 符号列表查看是否可以在现有包中找到您的符号。请注意,综合列表很长!超过 300 页。但它可搜索、组织良好,并且具有良好的目录和索引。
如果这没有帮助,那么也许是时候设计自己的符号了。最好给你的新符号起个名字,这样它就可以重复使用,并更容易地转移到另一个文档中。
如果您的符号将用作带极限的运算符(如积分或求和),则应使用\DeclareMathOperator
或\DeclareMathOperator*
命令。这两个命令都使用amsmath
包。无星号版本将下标和上标极限放在运算符的右侧;带星号版本在 中时将极限放在运算符的上方和下方displaystyle
。举例说明:
\DeclareMathOperator*{\squareop}{\square}
\DeclareMathOperator{\triangleop}{\bigtriangleup}
[请注意\square
使用该amssymb
包。]
然后是代码
\[
\squareop_{n=1}^{\infty} a_n \qquad \triangleop_{n=1}^{\infty} a_n
\]
将产生以下输出:
更多信息\DeclareMathOperator
请参见这个答案来自@Andrew Swann。
如果您的符号不以上述方式使用,您可能应该使用\newcommand
。
如果您的符号是数学符号:它是二元运算符(例如+
或\times
)吗?二元关系(例如<
或\leq
)吗?还是普通数学符号(例如!
或\infty
)?每种情况的间距都不同。比较符号的三个版本\times
:
\newcommand{\reltimes}{\mathrel{\times}}
\newcommand{\bintimes}{\mathbin{\times}}
\newcommand{\chrtimes}{{\times}}
然后\noindent $a\reltimes b \newline a\bintimes b \newline a\chrtimes b$
会产生输出:
请注意 中的额外一组花括号\chrtimes
。如果删除它们,您将获得与 相同的输出\mathbin{\times}
,因为\times
默认情况下是二元运算符。您可以将大多数数学符号括起来{}
以将它们转换为普通数学符号。
通常,二元关系的空间比二元运算符略大,比普通符号的空间大得多。但是,当它们作为下标或上标出现时,间距会发生变化。A_{a\times b}
如果放在下标中,上述三个示例看起来都会像这样。
可以通过修改或组合现有符号来创建许多新符号。要旋转、缩放或反射现有符号,请使用graphicx
或graphics
包。文档在这里。命令为\rotatebox
、\scalebox
、\resizebox
和\reflectbox
。
例如,如果您想要一个\cong
符号 (≅),但波浪号反转,则可以使用\reflectbox
命令 from 。代码graphicx
\newcommand{\backcong}{\mathrel{\reflectbox{$\cong$}}}
将产生所需的效果与代码$A\backcong B$
。
如果您尝试在下标中使用此代码(例如$X_{A\backcong B}$
),新符号将不会按应有的方式缩小。下面使用 解决了此问题\mathchoice
。
要组合多个符号(数学或文本),\ooalign
可以使用该命令。@egreg 有这里有详细解释。基本思想是\ooalign
创建一个单列表格,所有行相互叠加,列外无填充。“表”的每一行都以 结尾\cr
。可以使用 使条目在列中居中\hfil
。
例如,生产
我们将一个\circ
符号与一个文本T
字符叠加在一起。命令
\newcommand{\Tcirc}{\mathbin{%
\ooalign{\hfil$\circ$\hfil\cr\hfil T\hfil\cr}%
}}
一起$A\Tcirc B$
产生输出。
为了确保您的符号看起来正确,无论是显示、内联、脚本还是脚本脚本,您都可以使用\mathchoice
。 (注意mathpalette
(这里解释由@egreg 和@Werner 编写,当四个版本除了风格之外完全相同时才可使用。)
\mathchoice
{<do this if called in \displaystyle>}
{<do this if called in \textstyle>}
{<do this if called in \scriptstyle>}
{<do this if called in \scriptscriptstyle>}
上述代码将为四种数学风格分别产生相应的输出。
为了说明这一点,下面是解决扭曲产品问题这将适应脚本和脚本脚本。
\newcommand{\twprod}{\mathbin{\mathchoice%
{\ooalign{\hfil\raisebox{1.15ex}{\mbox{$\scriptstyle\sim$}}\hfil\cr\hfil$\times$\hfil\cr}}%
{\ooalign{\hfil\raisebox{1.15ex}{\mbox{$\scriptstyle\sim$}}\hfil\cr\hfil$\times$\hfil\cr}}%
{\ooalign{\hfil\raisebox{.85ex}{\mbox{$\scriptscriptstyle\sim$}}\hfil\cr\hfil$\scriptstyle\times$\hfil\cr}}%
{\ooalign{\hfil\raisebox{.65ex}{\scalebox{.8}{$\scriptscriptstyle\sim$}}\hfil\cr\hfil$\scriptscriptstyle\times$\hfil\cr}}%
}}
S^2\twprod S^2 \quad F_{S^2\twprod S^2} \quad F_{K_{S^2\twprod S^2}}
我缩小了\sim
每种款式的尺寸,以便更适合\times
。
使用 可以获得类似的效果stackengine
。文档在这里。
如果您无法通过组合或修改其他符号来创建自己的符号,则可以使用tikz
并结合上述想法从头开始设计自己的符号。以下是@marmot 的一个例子。
答案2
我想就“从头开始构建符号”部分进行一些扩展。有一些非常简单的基本原则可以帮助使符号可扩展:
- 对所有维度使用相对长度尺度。这些在这个答案。最重要的特征(就这里的目的而言)是它们会随着字体大小而缩放。
- 使用相对长度尺度来表示线宽。
- 考虑使用该
baseline
选项。
一个例子是这个帖子:
\documentclass{article}
\usepackage{tikz}
\newcommand{\inftrian}{\begin{tikzpicture}[baseline=-0.25em]
\draw[line width=0.075em] (-45:0.5em) -- (105:0.5em) (-15:0.5em) -- (-165:0.5em) (-135:0.5em) -- (75:0.5em);
\end{tikzpicture}}
\begin{document}
ABC \inftrian\ DEF
\end{document}
你可以将它与Sandy G 的回答很好关于\mathchoice
。我喜欢 Ti 的一点钾不过,Z 的优点在于,设计符号在我看来特别直观,因为它提供极坐标和笛卡尔坐标,并且适用于所有常见的编译器(latex
、、pdflatex
和,甚至,尽管语法略有不同)。上述简单示例的一个潜在缺点是它无法检测字体粗细等。可以通过检查字体粗细并使用以下方法(取自xelatex
lualatex
tex
\mathchoice
这里):
\documentclass{article}
\usepackage{tikz}
\usepackage{amsmath}
\makeatletter%
\DeclareRobustCommand{\checkbold}[1]{% https://tex.stackexchange.com/a/24635/121799
\def#1{0}%
\edef\@tempa{\f@series}\edef\@tempb{\bfseries@rm}%
\ifx\@tempa\@tempb%
\def#1{1}%
\fi%
\edef\@tempb{\bfseries@sf}%
\ifx\@tempa\@tempb%
\def#1{1}%
\fi}
\makeatother
\newcommand{\wedgearrow}{\checkbold\tmp%
\ensuremath{\mathrel{%
\mathchoice{%
\tikz[baseline=-0.1ex]{\draw[line width={(1+0.33*\tmp)*0.06em},->](0,0) -- (60:0.6em) -- ++ (-60:0.6em);}
}{%
\tikz[baseline=-0.1ex]{\draw[line width={(1+0.33*\tmp)*0.06em},->](0,0) -- (60:0.6em) -- ++ (-60:0.6em);}
}{%
\tikz[baseline=-0.075ex]{\draw[line width={(1+0.33*\tmp)*0.045em},->](0,0) -- (60:0.45em) -- ++(-60:0.45em);}
}{%
\tikz[baseline=-0.06ex]{\draw[line width={(1+0.33*\tmp)*0.035em},->](0,0) -- (60:0.35em) -- ++ (-60:0.35em);}
}}}}
\begin{document}
$A\wedgearrow B_{C\wedgearrow D}$ {\Large $A\wedgearrow B_{C\wedgearrow D}$}
\boldmath$A\wedgearrow B_{C\wedgearrow D}$ {\Large $A\wedgearrow B_{C\wedgearrow D}$}
\unboldmath
\end{document}
(请注意,我并不声称这是 100% 万无一失的,但我做了一些检查,它似乎运行良好。)
答案3
使用该命令的另一种可能性\stackinset
是stackengine
:
\documentclass[border = 2pt]{standalone}
\usepackage{stackengine, graphicx} %
\newcommand{\simtimes}{\stackMath\mathbin{\mathchoice%
{\stackinset{c}{0ex}{c}{0.9ex}{{\scalebox {0.67}{$\sim $}}}{\times}}%
{\stackinset{c}{0ex}{c}{0.9ex}{{\scalebox {0.67}{$\sim $}}}{\times}}%
{\stackinset{c}{0ex}{c}{0.7ex}{{\scalebox {0.67}{$\scriptstyle\sim $}}}{\scriptstyle\times}}%
{\stackinset{c}{0ex}{c}{0.6ex}{{\scalebox {0.67}{$\scriptscriptstyle\sim $}}}{\scriptscriptstyle\times}}%
}}
\begin{document}
$ S^2 \simtimes S^2 \quad F_{S^2 \simtimes S^2} \quad F_{K_{S^2 \simtimes S^2}}$
\end{document}
答案4
我提出这一点是为了与 Bernard 的答案形成一点对比,后者使用了stackengine
和\mathchoice
。这个答案也使用了stackengine
,但在两个方面有所不同:
它使用
\ensurestackMath{}
而不是\stackMath
,因为后者是全局声明,可能会影响stackengine
文档中 的其他使用。用户声明所有堆叠都应在数学中完成是一回事——但将这样的声明隐藏在宏中会给文档的其他区域带来潜在的麻烦。我
\stackengine
更喜欢使用\stackinset
,因为前者效率更高,而后者的功能(可以微调水平和垂直位置)在给定的答案中并未得到使用……所有stackengine
包宏都可以单独处理覆盖中的垂直移位。
但更重要的是,我展示了使用包\ThisStyle{...\SavedStyle...}
的功能scalerel
而不是\mathchoice
。不要误会——前者使用\mathchoice
原语,但它允许将语法压缩为单个语句,而不是 4 个数学选项的菜单。
那么 在此处完成什么\ThisStyle
?它表示\sim
在 上方堆叠一个 .67 缩放比例\times
,使用中央水平对齐并根据基线指定任何垂直偏移。但是,两个符号都应采用当前的数学大小(样式),无论它是什么(这就是 的功能\SavedStyle
——将调用时活动的样式导入\ThisStyle
到否则会丢失的地方)。
为了处理各种数学样式,我唯一需要做的额外调整是指定覆盖层的垂直移位\sim
,其高度为\dimexpr.25ex+.8\LMex
。在 中\ThisStyle
,1\LMex
等于 的值1ex
,但缩放到本地数学样式(默认情况下,.7ex
在\scriptstyle
和.5ex
中)。因此,在和中,移位为。在 中,移位为,在 中,移位为。\scriptscriptstyle
\displaystyle
\textstyle
1.05ex
\scriptstyle
.81ex
\scriptscriptstyle
.65ex
\documentclass[border = 2pt]{standalone}
\usepackage{stackengine,graphicx,scalerel}
\newcommand{\simtimes}{\mathbin{\ThisStyle{\ensurestackMath{%
\stackengine{\dimexpr.25ex+.8\LMex}{\SavedStyle\times}{%
\scalebox {0.67}{$\SavedStyle\sim$}}{O}{c}{F}{F}{L}}}}}
\begin{document}
$ S^2 \simtimes S^2 \quad F_{S^2 \simtimes S^2} \quad
F_{K_{S^2 \simtimes S^2}}$
\end{document}