我想在年轻人的画面中画一条楼梯路径,使用画面中盒子的侧面作为台阶。
例如,在画面中
\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}
顺便说一句,我已经改变了代码,以便盒子不位于“明显的”整数格点上。
用这种方式给方框上色和做很多其他事情也很容易。我在自己的论文中使用这些宏——尽管使用环境来装饰画面的技巧是我在编辑这篇文章时才想到的,所以谢谢:)