使用相同线宽的给定符号创建符号

使用相同线宽的给定符号创建符号

我尝试用给定符号创建新符号$\sqcup$,但效果不如预期。请看以下简单示例:

\documentclass{article}

\usepackage{graphicx}

\newcommand{\sqqcup}{\,{{\sqcup}\hspace*{-0.6em}\raisebox{-0.25ex}{--}}\;}

\begin{document}
\[
\scalebox{8}{$a \sqqcup b$}
\]
\end{document}

如您所见,我尝试在方形杯符号上放置的额外水平线并未以相同的线宽/强度排版。

有人知道如何绘制一条与现有符号线宽相同的线吗?

答案1

基本上,你只能用眼睛来做,就像你做的那样。TeX 没有关于线宽(或字形形状)的信息。即使你查看字体的 type1 或 metafont 源并找出原始设计宽度,你也无法确保在小尺寸下你得到确切地使用规则的宽度相同,因为字体中的线条受渲染器的字体提示机制的影响,该机制可能会将线条捕捉到像素边界上,而规则是由不同的机制绘制的,不受相同提示的影响。

您可能做得更好,只需偏移相同的字符,以便规则遵循相同的提示:

在此处输入图片描述

\documentclass{article}

\usepackage{graphicx}

\newcommand{\sqqcup}{\,{{\sqcup}\hspace*{-0.6em}\raisebox{-0.25ex}{--}}\;}


\def\xsqqcupb#1#2{\mathbin{\rlap{\raisebox{.15em}{$#1#2$}}{#2}}}
\def\sqqcupb{\mathpalette\xsqqcupb\sqcup}

\begin{document}
\[
\scalebox{8}{$a \sqqcup b$}
\]
\[
\scalebox{8}{$a \sqqcupb b$}
\]
\end{document}

更新:

正如评论中所讨论的那样,可以使用彩色规则隐藏额外的高度,但请注意,颜色可能会隐藏比您想要的更多内容(请注意修改后的示例中 fbox 的顶部栏)

在此处输入图片描述

\documentclass{article}

\usepackage{graphicx,color}

\newcommand{\sqqcup}{\,{{\sqcup}\hspace*{-0.6em}\raisebox{-0.25ex}{--}}\;}


\def\xsqqcupb#1#2{\rlap{\raisebox{.15em}{$#1#2$}}{#2}}
\def\sqqcupb{\mathbin{\mathpalette\xsqqcupb\sqcup}}

\def\xsqqcupc#1#2{\smash{\rlap{\raisebox{.15em}{$#1#2$}}\rlap{\color{white}\rule[.3em]{0.7em}{1.1ex}}}{#2}}
\def\sqqcupc{\mathbin{\mathpalette\xsqqcupc\sqcup}}


\begin{document}

\fbox{\scalebox{8}{$a \sqqcup x$}}

\bigskip

\fbox{\scalebox{8}{$a \sqqcupb x$}}

\bigskip

\fbox{\scalebox{8}{$a \sqqcupc x$}}

\end{document}

答案2

正如 David Carlisle 所说,没有完全自动的方法来猜测线宽。我建议您定义一个通用宏,然后可以根据特定字体进行调整

\newcommand{\gensqqcup}[3]{% #1 = bar height, #2 = bar thickness, #3 = sidebearings
  \ooalign{$\sqcup$\cr
           \hskip#3em
           \leaders\hrule height #1ex depth \dimexpr -#1ex+#2ex\hfill
           \hskip#3em\cr}}
\newcommand{\sqqcup}{\mathbin{\gensqqcup{.4}{.1}{.09}}}

最后一行的值似乎适合 Computer Modern 字体

在此处输入图片描述

MathPazo 字体可以使用相同的值

在此处输入图片描述

我也尝试了 KP 字体和 TX 字体,无论如何都获得了良好的结果。

这三个参数是

  • 条形高度(单位为 ex)
  • 钢筋厚度(单位为 ex)
  • 方杯的侧边距(缩短条形,使其位于符号内部)

通常,条形厚度的默认值(0.1ex,对于 Computer Modern 字体来说约为 0.4pt)可以是一个很好的猜测。该\ooalign方法避免了猜测其他参数的需要。

(感谢杰克指出相对测量单位更适合测量钢筋厚度。)

如果您希望符号也出现在下标和上标中,则必须使用更复杂的定义:

\newcommand{\gensqqcup}[4][\textstyle]{% #2 = bar height, #3 = bar thickness, #4 = sidebearings
  \ooalign{$#1\sqcup$\cr
           \hskip#4em
           \leaders\hrule height #2ex depth \dimexpr -#2ex+#3ex\hfill
           \hskip#4em\cr}}
\newcommand{\sqqcup}{\mathbin{\mathchoice
  {\gensqqcup[\displaystyle]{.4}{.1}{.09}}
  {\gensqqcup[\textstyle]{.4}{.1}{.09}}
  {\gensqqcup[\scriptstyle]{.3}{.08}{.07}}
  {\gensqqcup[\scriptscriptstyle]{.25}{.07}{.07}}
}}

这就是结果

$a \sqqcup b_{\sqqcup_{\sqqcup}}$

在此处输入图片描述

经过反复试验,您将找到三种尺寸的正确参数。

答案3

我借鉴了 Jake 的回答中的措施,并尝试对其进行小幅改进。首先,你应该用 包围代码以\mathbin获得正确的换行符(它是一个运算符,你应该告诉 LaTeX)。那么适当的间距就有点复杂了。我使用\mathrlapfrommathtools包来输入实际的字形,并\phantom为其保留空间。

在此处输入图片描述

\documentclass{article}

\usepackage{graphicx}

\usepackage{mathtools}    
\newcommand{\sqqcup}{\mathbin{\mathrlap{{\sqcup}\kern-0.6em\rule[0.3ex]{0.52em}{0.1ex}}}\phantom{\sqcup}}

\begin{document}
\[
\scalebox{8}{$a \sqqcup b$}
\]
\end{document}

答案4

好吧,杰克快了 90 秒。但我无法抗拒给出答案的压力。请不要投反对票。

\documentclass{article}
\usepackage{graphicx}    
\newcommand{\sqqcup}{\,{{\sqcup}\hspace*{-0.6em}\raisebox{0.25ex}{\vrule width 0.52em height 0.1ex}}\;}    
\begin{document}
\[
\scalebox{8}{$a \sqqcup b$}
\]
\end{document}

在此处输入图片描述

感谢 Jakes 推荐emex而不是pt

相关内容