有没有办法在代码的某一点使用计数器值,但使用某一行的计数器状态,该状态在计数器值的相应使用之后出现?
例如,在第 10 行定义计数器,在第 15 行使用它,\value{cnt}
并连续三行不断增加值。因此在第 18 行,计数器值保持为3
。我想3
在第 15 行使用此值()!因此\value{cnt}
在第 15 行应该返回3
。
以下是我的 MWE:
% MWE
\documentclass{scrbook}
\usepackage{lmodern}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[ngerman]{babel}
\usepackage{tabularx}
\usepackage{multirow}
\begin{document}
\newcounter{linecnt}
\begin{table}
\begin{tabular}[tbh]{p{4.2cm} p{0.68\textwidth}}
\textbf{Field} & \textbf{Entrys} \\
\hline
% This works fine:
\multirow{4 %------------------------------------------------------
}{4cm}{This Field} & Entry 1 \\
& Entry 2 \\
& Entry 3 \\
& Entry 4 \\[2ex]
% But it would be great if a didn't have to write the amount of lines everytime.
% Is there a way to use a counters value AFTER it's 'use' in the code. Somethining like:
\multirow{\value{linecnt} %------------------------------------------------------
}{4cm}{Another Field} & Automatic Entry 1 \stepcounter{linecnt} \\
& Automatic Entry 2 \stepcounter{linecnt} \\
& Automatic Entry 3 \stepcounter{linecnt} \\
& Automatic Entry 4 \stepcounter{linecnt} \\
% I would like to use the value of 'linecnt' NOW but in the beginning of the multirow-environment
\end{tabular}
\end{table}
\end{document}
我感谢您的帮助。
亲切的问候。
答案1
当您知道计数器的最终数字时,它\multirow
已经被排版了,因此您对此无能为力。
在这些情况下通常的方法是进行两次编译,将计数器的值写入文件.aux
。
首先,在前言中,我们为计数器定义一个初始值:
\def\savedthelinecnt{0}
然后,当我们知道计数器的最终值时,我们将其写入文件.aux
,以便在下一次编译时,\begin{document}
该计数器将更新为正确的值:
\immediate\protected@write\@auxout{}
{\gdef\protect\savedthelinecnt{\thelinecnt}}
经过两次传递后,值是正确的:
\documentclass{scrbook}
\usepackage{lmodern}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[ngerman]{babel}
\usepackage{tabularx}
\usepackage{multirow}
\makeatletter
\def\savedthelinecnt{0}
\makeatother
\begin{document}
\newcounter{linecnt}
\begin{table}[tbh]
\begin{tabular}{p{4.2cm} p{0.68\textwidth}}
\textbf{Field} & \textbf{Entries} \\
\hline
\multirow{4}{4cm}{This Field}
& Entry 1 \\
& Entry 2 \\
& Entry 3 \\
& Entry 4 \\[2ex]
\multirow{\savedthelinecnt}{4cm}{Another Field \savedthelinecnt}
& Automatic Entry 1 \stepcounter{linecnt} \\
& Automatic Entry 2 \stepcounter{linecnt} \\
& Automatic Entry 3 \stepcounter{linecnt} \\
& Automatic Entry 4 \stepcounter{linecnt} \\
\end{tabular}
\makeatletter
\immediate\protected@write\@auxout{}
{\gdef\protect\savedthelinecnt{\thelinecnt}}
\end{table}
\end{document}
顺便说一句,[tbh]
您传递给的可选参数tabular
(有点)无效。如果您指的是浮动位置t
op、b
ottom 和h
ere,那么您需要将参数传递给\begin{table}
。如果您指的是表格基线的垂直位置,那么有效选项是t
op t
、b
ottomb
和c
(实际上任何其他)c
entered。但这里只传递了一个字符。
答案2
使用refcount
; 注意\refstepcounter
而不是\stepcounter
。 注意空格:Automatic Entry 1 \refstepcounter{linecnt}
会有一个尾随空格。
请注意,对于或[tbh]
来说没有意义。环境采用定位参数。tabular
tabularx
table
\documentclass{scrbook}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[ngerman]{babel}
\usepackage{lmodern}
\usepackage{multirow}
\usepackage{refcount}
\newcounter{linecnt}
\begin{document}
\begin{table}[htp]
\begin{tabular}{p{4.2cm} p{0.68\textwidth}}
\textbf{Field} & \textbf{Entries} \\
\hline
% This works fine:
\multirow{4}{4cm}{This Field}
& Entry 1 \\
& Entry 2 \\
& Entry 3 \\
& Entry 4 \\[2ex]
\multirow{\getrefnumber{step1}}{4cm}{Another Field}
& Automatic Entry 1\refstepcounter{linecnt} \\
& Automatic Entry 2\refstepcounter{linecnt} \\
& Automatic Entry 3\refstepcounter{linecnt} \\
& Automatic Entry 4\refstepcounter{linecnt}\label{step1} \\
\end{tabular}
\end{table}
\end{document}
另一方面,下表更具可读性:
\documentclass{scrbook}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[ngerman]{babel}
\usepackage{lmodern}
\usepackage{tabularx}
\usepackage{booktabs}
\begin{document}
\begin{table}
\begin{tabularx}{\textwidth}{lX}
\toprule
\textbf{Field} & \textbf{Entries} \\
\midrule
This Field
& Entry 1 \\
& Entry 2 \\
& Entry 3 \\
& Entry 4 \\
\midrule
Another Field
& Automatic Entry 1 \\
& Automatic Entry 2 \\
& Automatic Entry 3 \\
& Automatic Entry 4 \\
\bottomrule
\end{tabularx}
\end{table}
\end{document}
没有必要将字段名称居中,这实际上可能会产生歧义。
答案3
您可以一次性完成此操作。
根据您的使用情况,代码可能需要一些额外的调整,但它在这里工作正常(主要限制是假设材料恰好以\\
或结尾\\<space>
)。
\documentclass{scrbook}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[ngerman]{babel}
\usepackage{lmodern}
\usepackage{multirow}
\makeatletter
\newcommand\myautorow[3]{%
\expandafter\multirow\expandafter
{\the\numexpr0\myautorow@getnboflines#3\\}{#1}{#2}#3%
}
\def\myautorow@getnboflines #1\\%
% the romannumeral is to swallow a space if present
{\if\relax\romannumeral-`0\detokenize{#1}\relax\expandafter\relax\else
+1\expandafter\myautorow@getnboflines \fi}
\makeatother
\begin{document}
\begin{table}[htp]
\begin{tabular}{p{4.2cm} p{0.68\textwidth}}
\textbf{Field} & \textbf{Entries} \\
\hline
% This works fine:
\multirow{4}{4cm}{This Field}
& Entry 1 \\
& Entry 2 \\
& Entry 3 \\
& Entry 4 \\[2ex]
\myautorow{4cm}{Another Field}{%
& Automatic Entry 1 \\
& Automatic Entry 2 \\
& Automatic Entry 3 \\
& Automatic Entry 4 \\}\hline
\myautorow{4cm}{Another Field}{%
& Automatic Entry 1 \\
& Automatic Entry 2 \\
& Automatic Entry 3 \\
& Automatic Entry 4 \\
& Automatic Entry 5 \\
& Automatic Entry 6 \\
& Automatic Entry 7 \\
}
\end{tabular}
\end{table}
\end{document}