TikZ 的分隔符大小不受限制

TikZ 的分隔符大小不受限制

比较这两个输出

在此处输入图片描述

您希望文档中采用哪种字体?我当然更喜欢右边的字体。但是,大多数字体(本例中为 MinionPro)仅提供四种尺寸的分隔符,如果需要更大的尺寸,则只能使用“可扩展分隔符”,但这可能看起来不太好看。

因为我们有 TiZ 可用,我认为创建一些灵活的选项来增强 TeX 中的分隔符会很棒。

问:如何使用 Ti 的力量Z 创建无限大的分隔符吗?

我已经编写了一些代码来实现这一点。但是,我以这种方式提问,以便它不会因为主题外、范围太广甚至不清楚而被关闭。

我的想法是在 Ti 中创造一个特定的人物Z(在用户命令内)可以通过某些参数轻松配置。最重要的是高度,它是假设命令的强制参数\PARENS{height}{content}。我已经做了很多分隔符(手动完成,不到两个小时,所以没有付出任何努力),但我将在这里分享括号(至少现在)。在我的例子中,一个参数和另一个参数之间没有关系(在理想的解决方案中这可能是完美的)

但是,我认为我的想法可以得到进一步发展。目前,它们只是一个tikzpicture用于开始分隔符,一个用于结束分隔符(只是用xscale=-1);如果有人想自动测量内容的高度,我只需设置一个框并测量它(使用嵌套括号时速度很慢);我expl3与 Ti混合Z 等

因此,如果有人想回答这个问题,以下几点可以很好地增强

  • 可以使用适当的 TiZ 系统提供更大的灵活性(可以添加某种形式的分隔符picdecoration
  • 使用 TiZ 系统测量内容的高度;
  • 能够灵活地计算高度函数的参数;
  • 可以创建一个系统将所有创建的括号保存到盒子中,并在使用相同高度时重复使用它们;
  • 正确决定哪些参数是必要的,哪些参数不是必要的;
  • ETC。

当然,也可以接受不同的风格,甚至不同的分隔符(我选择括号作为例子,因为它们比其他的更棘手,但当然与大括号无关!)。

除了我的问题的答案之外,我正在寻找的是任何可以以任何方式改善此分隔符的可用性的想法。

无论如何,我都会阅读评论/建议或任何可能的方式改进问题。

编辑:这不是一个简单的问题,也可能没有答案。无论如何,在过去的几个月里,我遇到了两件事。

  • 有一个calligraphyTi 库Z,如果答案带有该库提供的括号或分隔符就好了。
  • 可能比我的解决方案更容易创建一个考虑每个变量来确定两个控制点的函数;这些最终将用于创建曲线。

答案1

好吧,这是第一步。

代码很乱(混合expl3和 TiZ 不是一个好主意,但这是我所掌握的知识)。TiZ 代码甚至更难辨认,因为我写完后使用了搜索和替换来替换一些东西,我希望你(如果感兴趣的话)可以读懂它。


我创建了一个命令,它以与.\PARENS{…}类似的方式将内容括起来,自动测量内容的高度(这是错误的做法,因为所有内容居中的线的上方和下方可能有不同的高度,但我将其留待以后再处理)。\DeclarePairedDelimiter\PARENS*{…}

\PARENS[config]{…}可以通过一些参数进行配置(尝试改变它们可能会更容易,这样人们就可以了解它是如何工作的)

  • height,这是“重要”的参数;
  • outwidth,括号顶部和底部的宽度;
  • midwidth,括号中间的宽度;
  • insep,内容和分隔符之间的空格;
  • outsep,分隔符与分隔符外部之间的距离;
  • proportion,分隔符的高度与其使用的总水平空间之间的关系;
  • outangle,在极端处形成的角度;
  • inangle-i,,inangle-ii很难解释,通常垂直于outangle
  • looseness-i以及looseness-ii控制括号曲率的参数(0 到 1 之间,IIRC)(因为tikzpicture我用indlooseness来绘制曲线,可能不完美。

此外,我添加了 15 个已配置的括号,以避免使用\PARENS*{…}会变得非常慢的括号,可以像 一样使用\PARENS[15]{…}。它们都类似于 Typoma Minion Math 提供的 15 个括号。当然,可以默认配置更多以在其文档中使用。

这是很长的代码,而且远非最优

在此处输入图片描述

%!TEX TS-program = pdflatex
\documentclass{scrartcl}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenx}
\usepackage{MinionPro}
\usepackage{mathtools,xparse,tikz}
\usetikzlibrary{calc}

\newcommand*\tikzangle[2]{#1:#2}
\ExplSyntaxOn
\keys_define:nn { delimiter }
    {
        paren .code:n = \keys_set:nn { delimiter / paren } {#1} ,
    }
% PARENS (fold)
\dim_new:N \l_paren_height_dim
\dim_new:N \l_paren_outwidth_dim
\dim_new:N \l_paren_midwidth_dim
\dim_new:N \l_paren_insep_dim
\dim_new:N \l_paren_outsep_dim
\tl_new:N \l_paren_proportion_tl
\tl_new:N \l_paren_outangle_tl
\tl_new:N \l_paren_inangle_i_tl
\tl_new:N \l_paren_inangle_ii_tl
\tl_new:N \l_paren_looseness_i_tl
\tl_new:N \l_paren_looseness_ii_tl
\keys_define:nn { delimiter / paren }
    {
        height       .dim_set:N = \l_paren_height_dim      ,
        outwidth     .dim_set:N = \l_paren_outwidth_dim    ,
        midwidth     .dim_set:N = \l_paren_midwidth_dim    ,
        insep        .dim_set:N = \l_paren_insep_dim       ,
        outsep       .dim_set:N = \l_paren_outsep_dim      ,
        proportion   .tl_set:N  = \l_paren_proportion_tl   ,
        outangle     .tl_set:N  = \l_paren_outangle_tl     ,
        inangle-i    .tl_set:N  = \l_paren_inangle_i_tl    ,
        inangle-ii   .tl_set:N  = \l_paren_inangle_ii_tl   ,
        looseness-i  .tl_set:N  = \l_paren_looseness_i_tl  ,
        looseness-ii .tl_set:N  = \l_paren_looseness_ii_tl ,
        height       .initial:n = 11pt                     ,
        outwidth     .initial:n = .024cm                   ,
        midwidth     .initial:n = .045cm                   ,
        insep        .initial:n = .1em                     ,
        outsep       .initial:n = .1em                     ,
        proportion   .initial:n = .275                     ,
        outangle     .initial:n = 43                       ,
        inangle-i    .initial:n = 48                       ,
        inangle-ii   .initial:n = 48                       ,
        looseness-i  .initial:n = .8                       ,
        looseness-ii .initial:n = .85                      ,
    }
\NewDocumentCommand \PARENS { s o m }
    {
        \group_begin:
        \IfBooleanT {#1}
            {
                \setbox0=\hbox{$\displaystyle#3$}
                \dim_set:Nn \l_paren_height_dim { \ht0+\dp0 }
            }
        \IfValueT {#2} { \keys_set:nn { delimiter / paren } { #2 } }

        \mathopen{
        \kern \dim_use:N \l_paren_outsep_dim
        \begin{tikzpicture}
            [ xscale = -1,
                baseline = \dim_eval:n { -\fontdimen22\textfont2 } ]
            \coordinate (P1) at ( 0 , \dim_eval:n { .5\l_paren_height_dim } ) ;
            \coordinate (P2) at ( $ (P1) + ( \tikzangle { \l_paren_outangle_tl } { \l_paren_outwidth_dim } ) $ ) ;
            \coordinate (P3) at ( 0 , \dim_eval:n { -.5\l_paren_height_dim } ) ;
            \coordinate (P4) at ( $ (P3) + ( \tikzangle { -\l_paren_outangle_tl } { \l_paren_outwidth_dim } ) $ ) ;
            \coordinate (P5) at ( \dim_eval:n { \l_paren_proportion_tl\l_paren_height_dim/2 } , 0 ) ;
            \coordinate (P6) at ( $ (P5) + ( \tikzangle { 0 } { \l_paren_midwidth_dim } ) $ ) ;
            \fill [smooth]
                (P1)
                to
                (P2)
                to [ out = -\l_paren_inangle_ii_tl , in = 90 , looseness = \l_paren_looseness_ii_tl ]
                (P6)
                to [ out = -90 , in = \l_paren_inangle_ii_tl , looseness = \l_paren_looseness_ii_tl ]
                (P4)
                to (P3)
                to [ out = \l_paren_inangle_i_tl , in = -90 , looseness = \l_paren_looseness_i_tl ]
                (P5)
                to [ out = 90 , in = -\l_paren_inangle_i_tl , looseness = \l_paren_looseness_i_tl ]
                (P1)
                to cycle
                ;
        \end{tikzpicture}
        \kern \dim_use:N \l_paren_insep_dim
        }
        #3
        \mathclose{
        \kern \dim_use:N \l_paren_insep_dim
        \begin{tikzpicture}
            [ baseline = \dim_eval:n { -\fontdimen22\textfont2 } ]
            \coordinate (P1) at ( 0 , \dim_eval:n { .5\l_paren_height_dim } ) ;
            \coordinate (P2) at ( $ (P1) + ( \tikzangle { \l_paren_outangle_tl } { \l_paren_outwidth_dim } ) $ ) ;
            \coordinate (P3) at ( 0 , \dim_eval:n { -.5\l_paren_height_dim } ) ;
            \coordinate (P4) at ( $ (P3) + ( \tikzangle { -\l_paren_outangle_tl } { \l_paren_outwidth_dim } ) $ ) ;
            \coordinate (P5) at ( \dim_eval:n { \l_paren_proportion_tl\l_paren_height_dim/2 } , 0 ) ;
            \coordinate (P6) at ( $ (P5) + ( \tikzangle { 0 } { \l_paren_midwidth_dim } ) $ ) ;
            \fill [smooth]
                (P1)
                to
                (P2)
                to [ out = -\l_paren_inangle_ii_tl , in = 90 , looseness = \l_paren_looseness_ii_tl ]
                (P6)
                to [ out = -90 , in = \l_paren_inangle_ii_tl , looseness = \l_paren_looseness_ii_tl ]
                (P4)
                to (P3)
                to [ out = \l_paren_inangle_i_tl , in = -90 , looseness = \l_paren_looseness_i_tl ]
                (P5)
                to [ out = 90 , in = -\l_paren_inangle_i_tl , looseness = \l_paren_looseness_i_tl ]
                (P1)
                to cycle
                ;
        \end{tikzpicture}
        \kern \dim_use:N \l_paren_outsep_dim
        }
        \group_end:
    }
% (end)
\ExplSyntaxOff

\DeclarePairedDelimiter\pa{\lparen}{\rparen}

\ExplSyntaxOn
\keys_define:nn { delimiter / paren }
    {
        1 .meta:n =
            {
                height=9.16pt,
                outangle=51,
                inangle-i=38,
                inangle-ii=33,
                midwidth=.8pt,
                outwidth=.33pt,
                proportion=.379,
                looseness-i=.81,
                looseness-ii=.9,
                insep=0pt,
                outsep=0pt,
            } ,
        2 .meta:n =
            {
                height=11.28pt,
                outangle=51,
                inangle-i=41,
                inangle-ii=35,
                midwidth=.83pt,
                outwidth=.35pt,
                proportion=.357,
                looseness-i=.82,
                looseness-ii=.89,
                insep=0pt,
                outsep=0pt,
            } ,
        3 .meta:n =
            {
                height=14.44pt,
                outangle=48,
                inangle-i=43,
                inangle-ii=37.7,
                midwidth=.87pt,
                outwidth=.38pt,
                proportion=.336,
                looseness-i=.81,
                looseness-ii=.88,
                insep=0pt,
                outsep=0pt,
            } ,
        4 .meta:n =
            {
                height=17.6pt,
                outangle=48,
                inangle-i=45,
                inangle-ii=40.5,
                midwidth=.92pt,
                outwidth=.4pt,
                proportion=.322,
                looseness-i=.81,
                looseness-ii=.87,
                insep=0pt,
                outsep=0pt,
            } ,
        5 .meta:n =
            {
                height=20.74pt,
                outangle=48,
                inangle-i=46,
                inangle-ii=41,
                midwidth=.97pt,
                outwidth=.42pt,
                proportion=.312,
                looseness-i=.81,
                looseness-ii=.87,
                insep=0pt,
                outsep=0pt,
            } ,
        6 .meta:n =
            {
                height=23.92pt,
                outangle=45,
                inangle-i=46,
                inangle-ii=43,
                midwidth=.99pt,
                outwidth=.46pt,
                proportion=.308,
                looseness-i=.8,
                looseness-ii=.87,
                insep=0pt,
                outsep=0pt,
            } ,
        7 .meta:n =
            {
                height=27.02pt,
                outangle=45,
                inangle-i=47,
                inangle-ii=44,
                midwidth=1.04pt,
                outwidth=.48pt,
                proportion=.302,
                looseness-i=.8,
                looseness-ii=.87,
                insep=0pt,
                outsep=0pt,
            } ,
        8 .meta:n =
            {
                height=30.2pt,
                outangle=46,
                inangle-i=47,
                inangle-ii=44,
                midwidth=1.08pt,
                outwidth=.51pt,
                proportion=.297,
                looseness-i=.796,
                looseness-ii=.86,
                insep=0pt,
                outsep=0pt,
            } ,
        9 .meta:n =
            {
                height=33.38pt,
                outangle=46,
                inangle-i=47,
                inangle-ii=45.2,
                midwidth=1.13pt,
                outwidth=.53pt,
                proportion=.293,
                looseness-i=.796,
                looseness-ii=.86,
                insep=0pt,
                outsep=0pt,
            } ,
        10 .meta:n =
            {
                height=36.5pt,
                outangle=46,
                inangle-i=48,
                inangle-ii=45.2,
                midwidth=1.16pt,
                outwidth=.56pt,
                proportion=.291,
                looseness-i=.796,
                looseness-ii=.86,
                insep=0pt,
                outsep=0pt,
            } ,
        11 .meta:n =
            {
                height=42.92pt,
                outangle=43.5,
                inangle-i=48,
                inangle-ii=46,
                midwidth=1.16pt,
                outwidth=.56pt,
                proportion=.288,
                looseness-i=.79,
                looseness-ii=.86,
                insep=0pt,
                outsep=0pt,
            } ,
        12 .meta:n =
            {
                height=49.3pt,
                outangle=43.5,
                inangle-i=48,
                inangle-ii=47,
                midwidth=1.16pt,
                outwidth=.56pt,
                proportion=.286,
                looseness-i=.795,
                looseness-ii=.86,
                insep=0pt,
                outsep=0pt,
            } ,
        13 .meta:n =
            {
                height=55.68pt,
                outangle=43.5,
                inangle-i=48,
                inangle-ii=47,
                midwidth=1.16pt,
                outwidth=.56pt,
                proportion=.284,
                looseness-i=.785,
                looseness-ii=.85,
                insep=0pt,
                outsep=0pt,
            } ,
        14 .meta:n =
            {
                height=62.06pt,
                outangle=43.5,
                inangle-i=48,
                inangle-ii=47,
                midwidth=1.16pt,
                outwidth=.56pt,
                proportion=.283,
                looseness-i=.79,
                looseness-ii=.85,
                insep=0pt,
                outsep=0pt,
            } ,
        15 .meta:n =
            {
                height=68.44pt,
                outangle=43.5,
                inangle-i=48,
                inangle-ii=48,
                midwidth=1.15pt,
                outwidth=.56pt,
                proportion=.282,
                looseness-i=.78,
                looseness-ii=.85,
                insep=0pt,
                outsep=0pt,
            } ,
    }
\ExplSyntaxOff

\begin{document}
\[
    \PARENS*{
    \PARENS[15]{
    \PARENS[14]{
    \PARENS[13]{
    \PARENS[12]{
    \PARENS[11]{
    \PARENS[10]{
    \PARENS[9]{
    \PARENS[8]{
    \PARENS[7]{
    \PARENS[6]{
    \PARENS[5]{
    \PARENS[4]{
    \PARENS[3]{
    \PARENS[2]{
    \PARENS[1]{
    x
    }
    }
    }
    }
    }
    }
    }
    }
    }
    }
    }
    }
    }
    }
    }^M
    }
\]
\[
    \det\begin{pmatrix}
        a & b & c & d & e \\
        a & b & c & d & e \\
        a & b & c & d & e
    \end{pmatrix}
    \qquad
    \det\PARENS[10,outsep=2pt]{\begin{matrix}
        a & b & c & d & e \\
        a & b & c & d & e \\
        a & b & c & d & e
    \end{matrix}}
\]
\end{document}

我不知道还有什么可以做得更好!可能是某种设置/使用已保存的框,可能是不使用looseness并使用预先计算的控制点来绘制贝塞尔曲线,可能是使用 TiZ 设施可以提高稳健性并加快编译速度(picdecoration?)等。我不知道,任何东西都会受到欢迎。

相关内容