测试 \thePagewiseLineNumber 是多少

测试 \thePagewiseLineNumber 是多少

我想测试(而不是打印)实际的行是否是X页面的行。

借助该lineno包,我可以知道实际的线路是否是X文档的行,测试 的数字是多少 \thelinenumber。此外,我可以在页边距甚至行本身中打印页面的行,\thePagewiseLineNumber但与 不同 \thelinenumber,控制序列\thePagewiseLineNumber不能用于测试页面的行号是否大于、小于或等于X因为看起来那不是一个真正的计数器,所以有些就像\ifnum\thePagewiseLineNumber > 1 A \else B \fi产生“缺失数字”的错误。

让我用这个 MWE 更好地解释一下:

\documentclass[a4paper,12pt]{article}
\usepackage{xcolor,lipsum}
\usepackage[pagewise]{lineno}
\pagewiselinenumbers
\renewcommand\linenumberfont{\color{gray!50}}

\def\testinglinenumber{\noindent
Line \thePagewiseLineNumber\ 
(\thelinenumber\ in global count) --- 
% \ifnum\thePagewiseLineNumber>1   % Do not work (Missing number error)
\ifnum\thelinenumber>0 
  I am NOT in first line \else 
  I am in first line \fi\par}

\begin{document}

\testinglinenumber  % OK  because is still in first page 
\testinglinenumber  % OK because is still in first page
{\color{gray!50} \lipsum[1-4] More text \par More text \par } % only dummy text 

% the page break goes here
\testinglinenumber  % Wrong test, but I cannot test 
                    % \ifnum\thePagewiseLineNumber > 1 ....

\testinglinenumber  % Result of test OK but purely coincidental     
\end{document}

我一直在深入研究代码,lineno.sty试图找到正确的页面行计数器(或制作它),但对我来说这太深了。

有一些或没有的想法lineno吗?

答案1

是的,要做到这一点有点棘手。该命令\thePageWiseNumber是一个不可扩展的命令,这就是为什么说\ifnum\thePageWiseNumber失败的原因。通常从不可扩展的命令中获取输出的方法是将它们的输出存储在宏中。查看的代码,它只是调用当前行号上\thePageWiseNumber调用的命令:\getpagewiselinenumber

\def\thePagewiseLineNumber{\protect\getpagewiselinenumber{\the\c@linenumber}}

该宏\getpagewiselinenumber启动一个组,将其参数(“文档级”行号)存储到 中\c@linenumber,然后调用名称容易让人误解的宏\testNumberedPage,该宏计算页面级行号并将结果存储回 中\c@linenumber。然后,它打印出 的值\c@linenumber并结束该组以恢复 的原始值\c@linenumber

\def\getpagewiselinenumber#1{{% extra brace makes assignments local
    \c@linenumber #1\relax % store argument (a document-wise line number) in \c@linenumber
    \testNumberedPage % calculate page-wise line number, store result in \c@linenumber
    \thelinenumber % print \c@linenumber
}} % end the group to restore \c@linenumber

在我看来,这是糟糕的代码。为什么\c@linenumber要用它来存储 1) 实际当前行号 2) 输入值和 3) 输出值?如果\c@linenumber最后无法恢复,则会损坏.aux文件,并且 tex 会在您下次运行时挂起。此外,正如您所发现的,这种设计使得包的用户无法对计算出的值进行任何操作,只能直接打印它。它应该将输出值存储到一些命名良好的输出宏中,然后让用户使用它做他们想做的事情。

无论如何,既然我们了解了包的工作原理,那么编写我们自己的函数来测试当前页面就很容易了。

% #1 -- a macro to store the pagewise line number into 
\def\storepagewiselineno#1{%
   \bgroup % This group is to keep the value of \c@linenumber local
   \testNumberedPage % store the page-wise line number into \c@linenumber
   \xdef#1{\the\c@linenumber}% globally store the page-wise line number in #1
   \egroup % restore the value of \c@linenumber
}

另外,如果您不想进行全局定义,则可以使用以下版本,该版本使用标准技巧\c@linenumber通过 s 链将值“走私”出范围\expandafter。(pgf 定义了一个名为的宏\pgfmathsmuggle,可让您说出\pgfmathsmuggle\somemacro\endgroup并自动执行此操作)。

\def\storepagewiselineno#1{%
   \bgroup 
   \testNumberedPage 
   \expandafter\egroup % smuggle \c@linenumber out of the group with an \expandafter chain
   \expandafter\edef\expandafter#1\expandafter{\the\c@linenumber}% 
}

完整代码如下:

\documentclass[a4paper,12pt]{article}
\usepackage{xcolor,lipsum}
\usepackage[pagewise]{lineno}
\pagewiselinenumbers
\renewcommand\linenumberfont{\color{gray!50}}
\makeatletter
\def\storepagewiselineno#1{%
    \bgroup % This group is to keep the value of \c@linenumber local
    \testNumberedPage % store the page-wise line number into \c@linenumber
    \expandafter\egroup % smuggle \c@linenumber out of the scope
    \expandafter\edef\expandafter#1\expandafter{\the\c@linenumber}%
}
\makeatother


\def\testinglinenumber{\noindent
    Line \thePagewiseLineNumber\ (\thelinenumber\ in global count) ---
    \storepagewiselineno\temp
    \ifnum\temp>1\relax I am NOT in first line\else I am in first line\fi\par
}

\begin{document}
\testinglinenumber  
\testinglinenumber  
{\color{gray!50} \lipsum[1-4] More text \par More text \par }

\newpage

\testinglinenumber  
\testinglinenumber 
\end{document} 

相关内容