tikz矩阵:用作间隔物的列的宽度

tikz矩阵:用作间隔物的列的宽度

我想使用固定宽度 ( .85\paperwidth) 的隐形 tikz 矩阵在投影仪幻灯片中插入文本,左上部分有 2 列(约 3 厘米),右上部分也有类似的列。只有一个矩阵,中间有一个空列用作间隔。这样两个块将对称放置。

主要问题是中间列宽度的计算。我考虑设置矩阵设置并分别设置列 1、2、4、5 的宽度,这样会自动调整中间列的宽度,使整个矩阵宽度等于我的设置,但这样做不起作用。此外,我无法设置用于设置列 1、2、4、5 宽度的minimum width = .8\paperwidth用途。width("x")

\documentclass{beamer}
\newlength{\slw}\setlength{\slw}{160mm}
\newlength{\slh}\setlength{\slh}{100mm}
\geometry{verbose,papersize={\slw,\slh}}

\usepackage{tikz,calc,xfp}
\usetikzlibrary{calc,matrix}
  \tikzset{
  allmatrix/.style = {matrix of nodes, rounded corners = 1mm,
                      nodes in empty cells,matrix anchor=#1,
                      row sep=-\pgflinewidth, column sep=-\pgflinewidth,
                      ampersand replacement=\&, nodes={outer sep=0pt},
                      text height=1.5ex, text depth=.25ex},
  table/.style args= {#1/#2}{
        column #1/.append style={nodes={align=left,
        minimum width={\fpeval{#2 + 2 * 2mm}pt}, text width=#2}},
        }}

\begin{document}
\begin{frame}
\begin{tikzpicture}[overlay,remember picture]

\matrix at (current page.north)
[shift={(0,-2)}, allmatrix=north, nodes={draw},
table/.list={1/3cm,
             2/3cm,
             4/3cm,
             5/3cm}] (mytab)
% table/.list={1/width("le monde"),
%              2/width("new york times"),
%              4/width("le figaro"),
%              5/width("southern echo")}] (near)
{
le monde \& new york times  \& \& le figaro \& southern echo\\
innadu   \& le maine        \& \& penpavar  \& the hindu \\
times    \& spectrum        \& \& science   \& nature \\
};
\end{tikzpicture}
\end{frame}
\end{document}

答案1

除非您真的需要它,否则不要使用\fpeval它(并且它不理解width("…")哪个是 PGFmath 函数)。无论如何,PGF/TikZ 几乎将所有内容都放在 PGFmath 中,因此不需要另一个包来评估事物(除非您需要高精度)。

在下面的代码中,我完全删除了设置,minimum width因为text width已经指定了节点的宽度。PGF 只是添加了值/pgf/inner xsep两侧。

我选择将列 sep 设置为第二列和第三列(共四列)之间,而不是伪空列。为此,我预设了值键,/tikz/user1850133 column sep并且在执行过程.85\textwidth中,以及内部 xseps 的两倍将被减去。(准确地说,我只是构建了一个值table+/.listwidth("…")

.85\textwidth-width("le monde")-2*\pgfkeysvalueof{/pgf/inner xsep}-
             -width("southern echo")-2*\pgfkeysvalueof{/pgf/inner xsep}

实际评估是由 PGFmath 在矩阵构建的某个深处完成的。

(如果包含比默认值更复杂的值,则可能需要()进行计算。)\pgfkeysvalueof{…}.3333em


我已经添加

every outer matrix/.append style={inner sep=+0pt, outer sep=+0pt}

以便实际矩阵尽可能紧密因为矩阵本身有自己的内部(和外部)sep。

我还将向下移动改为2cm在画布坐标系中(而不是坐标坐标系)因为您只处理实际长度。


第二个框架由两个独立的矩阵构建,这两个矩阵的外边框.85\textwidth彼此不同。这样可以更轻松地创建具有不同列数的矩阵,而无需在拆分之前确定哪一个是列。

输出略有不同,但我认为这是由于长度和距离计算不精确造成的。

代码

\documentclass{beamer}
\geometry{verbose,papersize={160mm,100mm}}
\usepackage{tikz}
\usetikzlibrary{matrix}
\tikzset{
  allmatrix/.style = {matrix of nodes, rounded corners = 1mm,
                      nodes in empty cells, matrix anchor=#1,
                      every outer matrix/.append style={inner sep=+0pt, outer sep=+0pt},
                      row sep=-\pgflinewidth, column sep=-\pgflinewidth,
                      ampersand replacement=\&, nodes={outer sep=0pt},
                      text height=1.5ex, text depth=.25ex},
  table/.style args= {#1/#2}{
    column #1/.append style={nodes={align=left, text width=#2}}},
  table+/.style args= {#1/#2}{
    column #1/.append style={nodes={align=left, text width=#2}},
    user1850133 column sep/.append={-#2-2*\pgfkeysvalueof{/pgf/inner xsep}}}}

\begin{document}
\begin{frame}
\begin{tikzpicture}[overlay,remember picture]
\matrix at (current page.north)
[shift={(0,-2cm)}, allmatrix=north, nodes={draw},
 column 2/.append style={column sep=\pgfkeysvalueof{/tikz/user1850133 column sep}},
 user1850133 column sep/.initial=.85\textwidth,
 table+/.list={1/width("le monde"),
               2/width("new york times"),
               3/width("penpavar"),
               4/width("southern echo")}] (near)
{
    le monde \& new york times  \& le figaro \& southern echo\\
    innadu   \& le maine        \& penpavar  \& the hindu \\
    times    \& spectrum        \& science   \& nature \\
};
\end{tikzpicture}
\end{frame}

\begin{frame}
\begin{tikzpicture}[overlay,remember picture]
\matrix at (current page.north)
[shift={(-.5*.85\textwidth,-2cm)}, allmatrix=north west, nodes={draw},
 table/.list={1/width("le monde"),
              2/width("new york times"),
              3/width("penpavar"),
              4/width("southern echo")}] (near-l)
{
    le monde \& new york times\\
    innadu   \& le maine      \\
    times    \& spectrum      \\
};
\matrix at (current page.north)
[shift={(.5*.85\textwidth,-2cm)}, allmatrix=north east, nodes={draw},
 table/.list={1/width("penpavar"),
              2/width("southern echo")}] (near-r)
{
    le figaro \& southern echo\\
    penpavar  \& the hindu \\
    science   \& nature \\
};
\end{tikzpicture}
\end{frame}
\end{document}

输出

在此处输入图片描述

答案2

像这样吗?

\documentclass{beamer}
\newlength{\slw}\setlength{\slw}{160mm}
\newlength{\slh}\setlength{\slh}{100mm}
\geometry{verbose,papersize={\slw,\slh}}

\usepackage{tikz,calc,xfp}
\usetikzlibrary{calc,matrix}
  \tikzset{
  allmatrix/.style = {matrix of nodes, rounded corners = 1mm,
                      nodes in empty cells,matrix anchor=#1,
                      row sep=-\pgflinewidth, column sep=-\pgflinewidth,
                      ampersand replacement=\&, nodes={outer sep=0pt},
                      text height=1.5ex, text depth=.25ex},
  }

\begin{document}
\begin{frame}
\begin{tikzpicture}[overlay,remember picture]

\matrix at (current page.north)
[shift={(0,-2)}, allmatrix=north,         column 1/.append style={nodes={align=left,draw,
        text width={width("le monde")},
        }},
 column 2/.append style={nodes={align=left,draw,
        text width={width("new york times")},
        }},
 column 3/.append style={nodes={align=left,text width={.08\paperwidth},
        }},
 column 4/.append style={nodes={align=left,draw,
        text width={width("penpavar")},
        }},
 column 5/.append style={nodes={align=left,draw,
        text width={width("southern echo")},
        }}] (mytab)
% table/.list={1/width("le monde"),
%              2/width("new york times"),
%              4/width("le figaro"),
%              5/width("southern echo")}] (near)
{
le monde \& new york times  \& \& le figaro \& southern echo\\
innadu   \& le maine        \& \& penpavar  \& the hindu \\
times    \& spectrum        \& \& science   \& nature \\
};
\end{tikzpicture}
\end{frame}
\end{document}

在此处输入图片描述

答案3

只是一个建议。由于 OP 使用绝对定位,我认为放置两个独立矩阵比计算列之间的距离更容易。这是我使用 CarLaTeX 代码的方法的代码。

\documentclass{beamer}

\usepackage{tikz,calc,xfp}
\usetikzlibrary{calc,matrix}
  \tikzset{
  allmatrix/.style = {matrix of nodes, rounded corners = 1mm,
                      nodes in empty cells,matrix anchor=#1,
                      row sep=-\pgflinewidth, column sep=-\pgflinewidth,
                      ampersand replacement=\&, nodes={outer sep=0pt},
                      text height=1.5ex, text depth=.25ex},
                      nodes={align=left, draw}
        }

\begin{document}
\begin{frame}
\begin{tikzpicture}[overlay,remember picture]

\matrix at (current page.north west)
[shift={(1.5,-2)}, allmatrix=north west, draw=none, 
    column 1/.append style={nodes={text width={width("le monde")}}},
    column 2/.append style={nodes={text width={width("new york times")}}}]
    (mytab1)
{
le monde \& new york times\\
innadu   \& le maine\\
times    \& spectrum\\
};

\matrix at (current page.north east)
[shift={(-1.5,-2)}, allmatrix=north east, draw=none,
    column 1/.append style={nodes={text width={width("penpavar")}}},
    column 2/.append style={nodes={text width={width("southern echo")}}}]
    (mytab2)
{
le figaro \& southern echo\\
penpavar  \& the hindu \\
science   \& nature \\
};
\end{tikzpicture}
\end{frame}
\end{document}

在此处输入图片描述

相关内容