当 Detexify 失败时,如何制作自己的符号?

当 Detexify 失败时,如何制作自己的符号?

我第一次访问 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}如果放在下标中,上述三个示例看起来都会像这样。

可以通过修改或组合现有符号来创建许多新符号。要旋转、缩放或反射现有符号,请使用graphicxgraphics包。文档在这里。命令为\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和,甚至,尽管语法略有不同)。上述简单示例的一个潜在缺点是它无法检测字体粗细等。可以通过检查字体粗细并使用以下方法(取自xelatexlualatextex\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

使用该命令的另一种可能性\stackinsetstackengine

\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,但在两个方面有所不同:

  1. 它使用\ensurestackMath{}而不是\stackMath,因为后者是全局声明,可能会影响stackengine文档中 的其他使用。用户声明所有堆叠都应在数学中完成是一回事——但将这样的声明隐藏在宏中会给文档的其他区域带来潜在的麻烦。

  2. \stackengine更喜欢使用\stackinset,因为前者效率更高,而后者的功能(可以微调水平和垂直位置)在给定的答案中并未得到使用……所有stackengine包宏都可以单独处理覆盖中的垂直移位。

但更重要的是,我展示了使用包\ThisStyle{...\SavedStyle...}的功能scalerel而不是\mathchoice。不要误会——前者使用\mathchoice原语,但它允许将语法压缩为单个语句,而不是 4 个数学选项的菜单。

那么 在此处完成什么\ThisStyle?它表示\sim在 上方堆叠一个 .67 缩放比例\times,使用中央水平对齐并根据基线指定任何垂直偏移。但是,两个符号都应采用当前的数学大小(样式),无论它是什么(这就是 的功能\SavedStyle——将调用时活动的样式导入\ThisStyle到否则会丢失的地方)。

为了处理各种数学样式,我唯一需要做的额外调整是指定覆盖层的垂直移位\sim,其高度为\dimexpr.25ex+.8\LMex。在 中\ThisStyle1\LMex等于 的值1ex,但缩放到本地数学样式(默认情况下,.7ex\scriptstyle.5ex中)。因此,在和中,移位为。在 中,移位为,在 中,移位为。\scriptscriptstyle\displaystyle\textstyle1.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} 

在此处输入图片描述

相关内容