使用代码中出现的计数器值

使用代码中出现的计数器值

有没有办法在代码的某一点使用计数器值,但使用某一行的计数器状态,该状态在计数器值的相应使用之后出现?

例如,在第 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(有点)无效。如果您指的是浮动位置top、bottom 和here,那么您需要将参数传递给\begin{table}。如果您指的是表格基线的垂直位置,那么有效选项是top tbottombc(实际上任何其他)centered。但这里只传递了一个字符。

答案2

使用refcount; 注意\refstepcounter而不是\stepcounter。 注意空格:Automatic Entry 1 \refstepcounter{linecnt}会有一个尾随空格。

请注意,对于或[tbh]来说没有意义。环境采用定位参数。tabulartabularxtable

\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}

在此处输入图片描述

相关内容