在这个答案@egreg 提出了一种在集合符号中使用虚线的方法。
类似地,我想使用 Ti钾Z 画出分割线。思路也是先测量高度$\delimsize\vert$
。但是最后结果不对:
这里出了什么问题?
\documentclass{article}
\usepackage{tikz}
\usepackage{amssymb,mathtools}
\ExplSyntaxOn
\providecommand\given{}
\newcommand\setsymbol[1][]{%
\nonscript\:
\vbox_set:Nn \l_tmpa_box {$#1\vert$}
\dim_set:Nn \l_tmpa_dim { \box_ht:N \l_tmpa_box }
\tikz[baseline=.5\l_tmpa_dim,very~thick] \draw (0,0) -- (0,\l_tmpa_dim);
\allowbreak
\nonscript\:
\mathopen{}}
\DeclarePairedDelimiterX\set[1]\{\}{%
\renewcommand\given{\setsymbol[\delimsize]}
#1
}
\ExplSyntaxOff
\begin{document}
\[
\set{a \given \exists n \in \mathbb{N}, a^n = 1}
\]
\[
\set[\bigg]{a \given \exists n \in \mathbb{N}, a^n = 1}
\]
\end{document}
答案1
\the\dimexpr\ht\mybox+\dp\mybox
给出正确的线条高度(如果\newbox\mybox \setbox\mybox=\vbox{$#1\vert$}
设置则相当于非 latex3 代码)- 为 tikz 绘图设置正确的基线(在
baseline=\the\dp\mybox
,非 latex3 中)
奖励:使用tikz
绘制简单的可变宽度规则似乎有点过头了(除非应用花哨的样式)。更有效的解决方案是
- latex2e 命令
\rule
,如\rule[-\box_dp:N\l_tmpa_box]{1.2pt}{\box_ht_plus_dp:N \l_tmpa_box}
或 - 简单来说就是原始的
\vrule
,就像这样\vrule width 1.2pt height \box_ht:N\l_tmpa_box depth \box_dp:N\l_tmpa_box
。不幸的是,似乎还没有(公共)latex3 函数包装\vrule
。
\documentclass{article}
\usepackage{tikz}
\usepackage{amssymb,mathtools}
\ExplSyntaxOn
\providecommand\given{}
\newcommand\setsymbol[1][]{%
\nonscript\:
\vbox_set:Nn \l_tmpa_box {$#1\vert$}
\tikz[baseline=\dim_eval:n {\box_dp:N \l_tmpa_box}, very~thick]
\draw (0,0) -- (0,\dim_eval:n {\box_ht_plus_dp:N \l_tmpa_box});
\allowbreak
\nonscript\:
\mathopen{}
}
\DeclarePairedDelimiterX\set[1]\{\}{
\renewcommand\given{\setsymbol[\delimsize]}
#1
}
\ExplSyntaxOff
\begin{document}
\[
\set{a \given \exists n \in \mathbb{N}, a^n = 1}
\]
\[
\set[\bigg]{a \given \exists n \in \mathbb{N}, a^n = 1}
\]
\end{document}