我很难找到一个合适的标题(请随意更改)来回答我的问题,我想用一个例子来介绍:
情况
在我的文档中,我有时tabu
直接在文档中使用 s,而不将它们嵌套在table
- 环境中。
\documentclass[a4paper, 11pt]{scrbook}
\usepackage{blindtext}
\usepackage{tabu, booktabs}
\begin{document}
\section{TEST}
\blindtext
\\ \\
This is how I want my table to look like:
\ \\
{\centering
\begin{tabu} to 0.9\textwidth {X[l,2] X[l,2] X[l,3]} \toprule \rowfont{\bfseries}
Test1 & Test2 & Test3 \\ \midrule
Test1 & Test2 & Test3 \\
Test1 & Test2 & Test3 \\ \bottomrule
\end{tabu}\par} \medskip \ \\
\blindtext
\end{document}
现在,我想创建一个新的环境来帮助我构建这个表,我尝试了这样的事情:
\newenvironment{texttab}[1]
{\ \\ \centering%
\begin{tabu} to 0.9\textwidth {#1} \toprule \rowfont{\bfseries}}%
{\end{tabu}\par \medskip \ \\}
当然,这里#1
给出了tabu
-specifications。它有点工作正常,但如果你运行以下 MWE(添加和测试新环境)
\documentclass[a4paper, 11pt]{scrbook}
\usepackage{blindtext}
\usepackage{tabu, booktabs}
\newenvironment{texttab}[1]
{\ \\ \centering%
\begin{tabu} to 0.9\textwidth {#1} \toprule \rowfont{\bfseries}}
{\end{tabu}\par \medskip \ \\}
\begin{document}
\section{TEST}
\blindtext
\\ \\
This is how I want my table to look like: % no new environment
\ \\
{\centering
\begin{tabu} to 0.9\textwidth {X[l,2] X[l,2] X[l,3]} \toprule \rowfont{\bfseries}
Test1 & Test2 & Test3 \\ \midrule
Test1 & Test2 & Test3 \\
Test1 & Test2 & Test3 \\ \bottomrule
\end{tabu}\par} \medskip \ \\
\blindtext
\begin{texttab}{X[l,2] X[l,2] X[l,3]} % WITH NEW ENVIRONMENT
Test1 & Test2 & Test3 \\ \midrule
Test1 & Test2 & Test3 \\
Test1 & Test2 & Test3 \\ \bottomrule
\end{texttab}
\blindtext
\end{document}
您将看到在第二个表格之后的盲文开头有一个缩进。即使\noindent
像这样添加到新环境中
\newenvironment{texttab}[1]
{\ \\ \centering%
\begin{tabu} to 0.9\textwidth {#1} \toprule \rowfont{\bfseries}}
{\end{tabu}\par \medskip \ \\ \noindent} % added \noindent here
没有帮助,因为它仍然留下一些空间(我可以用它删除\!\!
,但是......)。
如果我可以在第一个代码示例中使用包含 and 的{
and ,那么这不会成为问题。但是,我无法将它们放入新环境的定义中,因为这会导致分隔符问题……我不想使用-environment,因为其中存在不需要的垂直空格(在撰写本文时,这似乎有点可笑……)}
{\centering
\par}
center
\newenvironment{texttab}[1]
{{\\centering% % } missing!
\begin{tabu} to 0.9\textwidth {#1} \toprule \rowfont{\bfseries}}%
{\end{tabu}\par} \medskip \ \\} % { missing!
问题
- 有没有办法,可以摆脱运行版本中出现的那些“无法控制的空间”,或者使最后一段代码可行?(我不想
minipage
在这里使用,因为我可能想用 使它易碎longtabu
。) 那么,继续使用(目前)有效的“新环境”:为什么不
\newenvironment{texttab}[2] {\ \\ \centering% \begin{#1tabu} to 0.9\textwidth {#2} \toprule \rowfont{\bfseries}} {\end{#1tabu}\par \medskip \ \\}
工作,这样我就可以通过设置第一个参数轻松地将其更改
tabu
为?longtabu
long
我是否应该尝试将所有这些打包成一个新的命令有几个参数?
您是否认为整个想法可能是……愚蠢的?
答案1
我认为保持简单更好。;-)
\documentclass[a4paper, 11pt]{scrbook}
\usepackage{blindtext}
\usepackage{tabu, booktabs}
\newenvironment{texttab}[1]
{\setlength{\topsep}{\baselineskip}%
\begin{center}
\begin{tabu} to 0.9\textwidth {#1} \toprule \rowfont{\bfseries}}
{\end{tabu}\end{center}}
\begin{document}
\section{TEST}
This is how I want my table to look like: % no new environment
\begin{center}
\begin{tabu} to 0.9\textwidth {X[l,2] X[l,2] X[l,3]} \toprule \rowfont{\bfseries}
Test1 & Test2 & Test3 \\ \midrule
Test1 & Test2 & Test3 \\
Test1 & Test2 & Test3 \\ \bottomrule
\end{tabu}
\end{center}
\blindtext
\begin{texttab}{X[l,2] X[l,2] X[l,3]} % WITH NEW ENVIRONMENT
Test1 & Test2 & Test3 \\ \midrule
Test1 & Test2 & Test3 \\
Test1 & Test2 & Test3 \\ \bottomrule
\end{texttab}
\blindtext
\end{document}
为了控制表格上方和下方的垂直间距,请修改 的值\topsep
,而不是使用\\
(这应该绝不用于“留空行”)。我使用了\topsep=\baselineskip
,请根据您的需要进行更改;老实说,我甚至没有设置它,所以使用默认值。
您可以通过定义来解决第二个问题
\newenvironment{texttab}[2][]
{\def\longornot{#1}\setlength{\topsep}{\baselineskip}%
\begin{center}
\begin{#1tabu} to 0.9\textwidth {#2} \toprule \rowfont{\bfseries}}
{\expandafter\end\expandafter{\longornot tabu}\end{center}}
所以你可以说
\begin{texttab}[long]{X[l,2] X[l,2] X[l,3]}
...
\end{texttab}
但我更喜欢定义一个不同的环境,比如
\newenvironment{texttab*}[1]
{\setlength{\topsep}{\baselineskip}%
\begin{center}
\begin{longtabu} to 0.9\textwidth {#1} \toprule \rowfont{\bfseries}}
{\end{longtabu}\end{center}}
问题是您不能#1
在最后一个参数中使用\newenvironment
。请自行选择。