穿过年轻画面的楼梯路径

穿过年轻画面的楼梯路径

我想在年轻人的画面中画一条楼梯路径,使用画面中盒子的侧面作为台阶。

例如,在画面中

\documentclass[border=2mm]{standalone}
\usepackage{ytableau}
\begin{document}
\ytableausetup
{boxsize=1.25em}
\ytableausetup
{aligntableaux=top}
\begin{ytableau}
*(blue!40) 1& *(blue!40) 3 &*(blue!40) 5 &7&9\\
*(blue!40) 2 & *(blue!40) 4 &8&10&11
\end{ytableau}
\end{document}  

我希望将盒子底部的入口 2 作为第一步,然后是盒子 4 的底部,然后是盒子 4 的右侧,盒子 5 的底部,盒子 5 的右侧,顶部盒子 7,顶部盒子 9。

颜色并不重要,它们只是为了方便,只要在画面上画出这条路径即可。

有任何想法吗?

答案1

tikz包可用于此目的。我们可以将此表视为节点内的文本,并据此绘制楼梯。我们varwidth在这里使用包使节点尽可能紧凑。建议的代码如下:

\documentclass[border=2mm]{standalone}
\usepackage{ytableau,tikz,varwidth}
\usetikzlibrary{calc}
\begin{document}

\begin{tikzpicture}[inner sep=0in,outer sep=0in]
\node (n) {\begin{varwidth}{5cm}{
\begin{ytableau}
*(blue!40) 1 & *(blue!40) 3 & *(blue!40) 5 &7  &9\\
*(blue!40) 2 & *(blue!40) 4 & 8            &10 &11
\end{ytableau}}\end{varwidth}};
\draw[thick,orange] (n.south west)--([xshift=1.09cm]n.south west)--([xshift=1.09cm]n.west)--([xshift=-1.09cm]n.east)--([xshift=-1.09cm]n.north east)--(n.north east);
\end{tikzpicture}
\end{document}

预期输出:

在此处输入图片描述

根据 Combin 的评论,我们可以对任意表执行此解决方案。这只是一个知道单元格大小的问题。以下是另一个倾斜表的示例:

\documentclass[border=2mm]{standalone}
\usepackage{ytableau,tikz,varwidth}
\usetikzlibrary{calc}
\begin{document}

\begin{tikzpicture}[inner sep=0in,outer sep=0in]
\node (n) {\begin{varwidth}{5cm}{
\ytableausetup{notabloids}
\begin{ytableau}
\none & \none & *(blue!40)1 & 2 \\
\none & *(blue!40)1 & 2 \\
*(blue!40)1 & 2 \\
2
\end{ytableau}}\end{varwidth}};
\draw[very thick,orange] ([yshift=-.5*1.09cm]n.west)--++(.5*1.09,0)--++(0,.5*1.09)--++(.5*1.09,0)--++(0,.5*1.09)--++(.5*1.09,0)--++(0,.5*1.09)--++(.5*1.09,0);
\end{tikzpicture}
\end{document}

现在输出是这样的:

在此处输入图片描述

作为变体,请尝试以下操作tikz解决方案。它需要两次运行,一次用于计算位置,另一次用于绘制。以下是建议的代码(灵感来自 Peter Grill 对这个问题):

\documentclass[border=2mm]{standalone}
\usepackage{ytableau}
\usepackage{tikz}
\begin{document}

\newcommand{\tikzmark}[2]{\tikz[overlay,remember picture,baseline] \node [anchor=base] (#1) {$#2$};}

\newcommand{\DrawVLine}[3][]{%
  \begin{tikzpicture}[overlay,remember picture]
    \draw[shorten >=0.2mm,shorten <=-0.1mm, #1] ([xshift=0.1mm]#2.south east) -- ([xshift=0.1mm]#3.north east);
  \end{tikzpicture}
}

\newcommand{\DrawHLine}[3][]{%
  \begin{tikzpicture}[overlay,remember picture]
    \draw[shorten <=-0.2mm,shorten >=-0.1mm, #1] (#2.south west) -- (#3.south east);
  \end{tikzpicture}
}

\newcommand{\DrawHLineAbove}[3][]{%
  \begin{tikzpicture}[overlay,remember picture]
    \draw[shorten >=-0.2mm, #1] ([yshift=-0.3mm]#2.north east) -- ([yshift=-0.31mm]#3.north east);
  \end{tikzpicture}
}

\ytableausetup
{boxsize=1.25em}
\ytableausetup
{aligntableaux=top}
\begin{ytableau}
 1&  3 &\tikzmark{b-5}{5}&7&\tikzmark{b-9}{9}\\
\tikzmark{b-2}{2} & \tikzmark{b-4}{4}&8&10&11
\end{ytableau}

\DrawHLine[blue, thick]{b-2}{b-4}
\DrawVLine[blue, thick]{b-4}{b-4}
\DrawHLine[blue, thick]{b-5}{b-5}
\DrawVLine[blue, thick]{b-5}{b-5}
\DrawHLineAbove[blue, thick]{b-5}{b-9}

\end{document} 

输出结果如下:

在此处输入图片描述

答案2

[编辑:改进了语法并说明了如何应对不同的形状,并在评论中回答了 OP 的疑问。

我同意 AboAmmar 的观点蒂克兹是一种很好的方法。这是一个稍微简短的解决方案,主要区别在于它使用 tikz 来绘制 tableau,从而产生许多快捷方式。这是首先正常绘制 tableau,其次将相同的代码插入另一个tikzpicture环境以便可以绘制蓝线的结果:

在此处输入图片描述

我重写了原来的代码,使其看起来更美观且更易于使用。我还添加了上面的第三个示例来展示如何制作三行表格——任意形状都可以。

下面的示例代码定义了一个Tableau绘制 tableau 的环境,然后允许tikz在 tableau 之后显示任意代码。还有一个“快捷方式”宏\tableau,可以绘制普通的 tableau,而无需任何额外的修饰。

Tableau环境和\tableau宏中,tableau 的条目都指定为“逗号分隔列表”,如 `{{1,3,5,7,9},{2,4,8,10,11}}。这定义了一个两行的 tableau,第一行是 1 3 5 7 9,第二行是 2,4,8,10,11。您可以通过这种方式指定任意数量的行和列,并输入任何合理的条目。

以下是完整的乳胶代码:

\documentclass{article}
\usepackage{tikz}
\usepackage{xparse}

\newcount\tableauRow
\newcount\tableauCol
\def\tableauDim{0.4}
\newenvironment{Tableau}[1]{%
  \tikzpicture[scale=0.4,draw/.append style={thick,black},
                      baseline=(current bounding box.center)]
    % now draw the tableau
    \tableauRow=-1.5
    \foreach \Row in {#1} {
       \tableauCol=0.5
       \foreach\k in \Row {
         \draw[thin](\the\tableauCol,\the\tableauRow)rectangle++(1,1);
         \draw[thin](\the\tableauCol,\the\tableauRow)+(0.5,0.5)node{$\k$};
         \global\advance\tableauCol by 1
       }
       \global\advance\tableauRow by -1
    }
}{\endtikzpicture}
\newcommand\tableau[1]{\begin{Tableau}{#1}\end{Tableau}}

\begin{document}

\begin{tabular}{l@{\qquad}l@{\qquad}l}
  \tableau{{1,3,5,7,9},{2,4,8,10,11}}
&
  \begin{Tableau}{{1,3,5,7,9},{2,4,8,10,11}}
      \draw[very thick,blue] (0,-2)--(2,-2)--(2,-1)--(3,-1)--(3,0)--(5,0);
  \end{Tableau}
&
  \begin{Tableau}{{1,5,7,9},{2,4,10,11},{3,8,14}}
    \draw[very thick,blue](0,-3)--(2,-3)--(2,-2)--(3,-2)--(3,-1)--(4,-1)--(4,0);
  \end{Tableau}
\end{tabular}

\end{document}

顺便说一句,我已经改变了代码,以便盒子不位于“明显的”整数格点上。

用这种方式给方框上色和做很多其他事情也很容易。我在自己的论文中使用这些宏——尽管使用环境来装饰画面的技巧是我在编辑这篇文章时才想到的,所以谢谢:)

相关内容