我尝试用给定符号创建新符号$\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)。那么适当的间距就有点复杂了。我使用\mathrlap
frommathtools
包来输入实际的字形,并\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 推荐em
和ex
而不是pt
。