帮助设计一个用于个人标记的包

帮助设计一个用于个人标记的包

我正在尝试排版用于我自己工作的符号,并且正在努力创建灵活的命令。该符号涉及将数学符号和表达式放置在三角形网格的顶点上,然后在方程中使用这些对象,从而产生如下图像:

符号

符号1

符号2

符号3

到目前为止,我一直在摆弄tikzpicture和精心调整节点位置,直到它看起来正确为止,但我想创建一些命令或包,使我能够选择结构(如twoOverThree第四幅图所示),并输入参数({a}{b}{c}{d}{e}无论它们是单个字母还是稍微复杂的表达式)。有什么建议吗?该tikzpicture策略通常不起作用,因为根据参数,始终需要调整节点定位。

答案1

所有这些符号都可以用简单的复制arrays,为什么需要TikZ

\documentclass{article}
\usepackage{amsmath,array}

\newcommand{\twooverthree}[5]{
    \begin{array}{@{}c@{}c@{}c@{}c@{}c@{}}
        &#1&&#2\\
        #3&&#4&&#5
    \end{array}}

\newcommand{\twooverone}[3]{
    \begin{array}{@{}c@{}c@{}c@{}}
        #1&&#2\\
        &#3
    \end{array}}

\newcommand{\oneovertwo}[3]{
    \begin{array}{@{}c@{}c@{}c@{}}
        &#1\\
        #2&&#3\\
    \end{array}}

\newcommand{\oneone}[2]{
    \begin{array}{@{}c@{}c@{}}
        #1\\
        &#2\\
    \end{array}}

\begin{document}
\[
\left(\oneone{a}{b}\right)\left(\oneone{d}{e}\right)
\]

\[
\alpha\left(\twooverone{a}{c}{b}\right) = 
\oneovertwo{\alpha b}{\alpha c}{\alpha a}
\]

\[
\oneone{\oneone{a}{\overline{v}}}{\oneone{\overline{w}}{f}}
\]

\[
\twooverthree{a}{b}{c}{d}{e}
\]
\end{document}

在此处输入图片描述

答案2

这是我尝试为您的自定义符号提供的优雅解决方案。此解决方案不需要任何软件包(amsmath仅包含在\bar{}示例方程式中的命令示例中)。

在此处输入图片描述

\documentclass{article}
\usepackage{amsmath}

\newcommand\slantstack[2]{%
    \raisebox{1.25ex}{$#1$}%
    \raisebox{-1.25ex}{$#2$}}

\newcommand\tristack[3]{%
    \raisebox{-1.25ex}{$#1$}\kern.5ex%
    \raisebox{1.25ex}{$#2$}%
    \raisebox{-1.25ex}{$#3$}}

\newcommand\invtristack[3]{%
    \raisebox{1.25ex}{$#1$}%
    \kern.5ex\raisebox{-1.25ex}{$#2$}%
    \kern.5ex\raisebox{1.25ex}{$#3$}}

\newcommand\quadstack[4]{%
    \raisebox{4.25ex}{$#1$}%
    \kern-.5ex\raisebox{1.25ex}{$#2$}%
    \kern-.5ex\raisebox{-1.25ex}{$#3$}%
    \kern-.5ex\raisebox{-4.25ex}{$#4$}}

\newcommand\twooverthree[5]{%
    \raisebox{-1.25ex}{#1}%
    \raisebox{1.25ex}{#2}%
    \raisebox{-1.25ex}{#3}%
    \raisebox{1.25ex}{#4}%
    \raisebox{-1.25ex}{#5}}

\begin{document}
    \begin{center}
        \begin{tabular}{ccccc}
            \multicolumn{5}{l}{Five basic commands:}\\\hline\\
            \texttt{\textbackslash slantstack}&
            \texttt{\textbackslash tristack}&
            \texttt{\textbackslash invtristack}&
            \texttt{\textbackslash quadstack}&
            \texttt{\textbackslash twooverthree}\\
            \slantstack{a}{b}&
            \tristack{a}{b}{c}&
            \invtristack{a}{b}{c}&
            \quadstack{a}{b}{c}{d}&
            \twooverthree{a}{b}{c}{d}{e}\\\\
            \multicolumn{5}{l}{Identical function in and out of math mode:}\\\hline\\
            $\slantstack{a}{b}$&
            $\tristack{a}{b}{c}$&
            $\invtristack{a}{b}{c}$&
            $\quadstack{a}{b}{c}{d}$&
            $\twooverthree{a}{b}{c}{d}{e}$\\\\
            \multicolumn{5}{l}{Works properly with \texttt{\textbackslash left} \& \texttt{\textbackslash right} commands:}\\\hline\\
            $\left(\slantstack{a}{b}\right)$&
            $\left(\tristack{a}{b}{c}\right)$&
            $\left(\invtristack{a}{b}{c}\right)$&
            $\left(\quadstack{a}{b}{c}{d}\right)$&
            $\left(\twooverthree{a}{b}{c}{d}{e}\right)$\\\\
            \multicolumn{5}{l}{Your equations:}\\\hline\\
            \multicolumn{5}{c}{$\left(\slantstack{a}{b}\right)\left(\slantstack{d}{e}\right)$
            \hfill $\alpha\left(\invtristack{a}{b}{c}\right) = \tristack{\alpha c}{\alpha b}{\alpha a}$
            \hfill \quadstack{a}{\bar{v}}{\bar{w}}{\text{f}}
            \hfill \twooverthree{a}{b}{c}{d}{e}}
        \end{tabular}
    \end{center}
\end{document}

此答案仅使用基本\raisebox\kern命令,因此它适用于我想到的每个用例,并且与周围的文本和方程式对齐和留白。它还应该可以完美地适用于不同的字体大小。

答案3

为了:

  1. 这可以使用以下解决方案来完成这个答案。您需要将线设为白色。
  2. 您可以在这里使用矩阵或设置一个\newcommand(我正在研究它)。
  3. 这可以通过 foreach 完成,只有两行代码(我不认识上面那行的字母,但你明白了):

    在此处输入图片描述

    \documentclass[margin=10pt]{standalone}
    \usepackage{tikz}
    
    \begin{document}
    \begin{tikzpicture}[x=2mm, y=5mm]
    
    \foreach \y/\letter [count=\x from 0] in {5/a,4/$v$,3/$w$,2/f}{
        \node at (\x,\y) {\letter};
    }   
    
    \end{tikzpicture} 
    \end{document}
    
  4. 与第 3 点相同,可以在 foreach 中完成(可能比我做的更简单):

    在此处输入图片描述

     \documentclass[margin=10pt]{standalone}
     \usepackage{tikz}
    
     \foreach \y/\letter [count=\x from 0] in {0/a,1/b,0/c,1/d,0/e}{
     \node at (\x,\y) {\letter};
     }  
     \end{tikzpicture} 
     \end{document}
    

答案4

使用宏设置这些很简单stackengine(原始答案),使用软件包设置甚至更容易tabstackengine(修订答案)。但是,我觉得我没有足够的信息来设置宏快捷方式,因为我不知道所需语法的全部范围。

由于您的许多数据项都是直立(非数学)字体,因此我将默认设置设为直立。如果您的符号中的项通常是数学项,则只需\stackMath在序言中发出,堆栈就会假定参数是数学模式。

修改后的答案

\documentclass{article}
\usepackage{tabstackengine}
\def\stacktype{L}\setstackgap{L}{.8\baselineskip}
\begin{document}
\[ 
\Bigl( \tabbedstackanchor{a&}{&b}\Bigr)
\Bigl( \tabbedCenterstack{d&\\&e}\Bigr)
\]

\[
\alpha\Bigl( \tabbedstackanchor{a&&c}{&b&} \Bigr) = 
  \tabbedstackanchor{&$\alpha$b&}{$\alpha$c&&$\alpha$a}
\]

\[
\tabbedCenterstack{a&&&\\&$\bar v$&&\\&&$\bar w$&\\&&&f} = 0
\]

\[
\tabbedstackanchor{&b&&d&}{a&&c&&e}
\]
\end{document}

在此处输入图片描述

原始答案stackengine

在下面的 MWE 中,我展示了获取结果的各种方法。

\documentclass{article}
\usepackage[usestackEOL]{stackengine}
\def\stacktype{L}\setstackgap{L}{.8\baselineskip}
\begin{document}
\[ 
\Bigl( \stackanchor{a~~}{~~b}\Bigr)
\Bigl( \Centerstack{d~~\\~~e}\Bigr)
\]

\[
\alpha\Bigl( \stackanchor{a~~c}{b} \Bigr) = 
  \stackanchor{$\alpha$b}{$\alpha$c~~~$\alpha$a}
\]

\[
\makebox[7ex]{%
\tllap[.5\dimexpr\Lstackgap\relax]{\tllap{a}$\bar v$}\brlap[.5\dimexpr\Lstackgap\relax]{$\bar w$\brlap{f}}
}  = 0
\]

\[
\stackanchor{b~~d}{a~~c~~e}
\]
\end{document}

在此处输入图片描述

相关内容