在文档开头有条件地显示引用

在文档开头有条件地显示引用

我想在文档开头显示一些参考资料,并附带一些条件。以下是示例代码

\documentclass{article}
\usepackage{hyperref}

\newcounter{ctest}
\setcounter{ctest}{0}
\newenvironment{test}{%
  \refstepcounter{ctest}%
  \label{test:\thectest}%
  \par\noindent\thectest.\hspace{1em}%
}{}

\begin{document}
Ref here with some conditions such as \verb|\thectest > 1|

\ref{test:2}
\ref{test:3}

\begin{test}
  first
\end{test}
\begin{test}
  second
\end{test}
\begin{test}
  third
\end{test}
\end{document}

在此处输入图片描述

有没有办法写入/附加

\ifnum\thectest>1%
  \ref{test:\thectest}%
\fi%

到另一个文件并将其输入到正确的位置。

答案1

此包totcount正是针对这样的要求而设计的。

totcount引入了一个新的概念“总计数器”。以下示例中,\newtotcounter{ctest}创建了一个总计数器并\totvalue{ctest}检索其总值(上次编译结束时的最终值)。

\documentclass{article}
\usepackage{totcount}

\newtotcounter{ctest}

\newenvironment{test}{%
  \refstepcounter{ctest}%
  \label{test:\thectest}%
  \par\noindent\thectest.\hspace{1em}%
}{}

\begin{document}
\ifnum\totvalue{ctest}>2\relax
  <true code>
\else
  <false code>
\fi

\begin{test} content \end{test}
\begin{test} content \end{test}
% \begin{test} content \end{test}
\end{document}

如果您对直接实现感兴趣,请参见以下示例

\documentclass{article}
\usepackage{totcount}

\newcounter{ctest}
\newcounter{ctest@total}
\setcounter{ctest@total}{-1}

\makeatletter
\AtEndDocument{%
  \write\@auxout{\string\setcounter{ctest@total}{\arabic{ctest}}}%
}
\makeatother

\newenvironment{test}{%
  \refstepcounter{ctest}%
  \label{test:\thectest}%
  \par\noindent\thectest.\hspace{1em}%
}{}

\begin{document}
\ifnum\arabic{ctest@total}=-1\relax
  <a second run is required>
\else
  \ifnum\arabic{ctest@total}>2\relax
    <true code>
  \else
    <false code>
  \fi
\fi

\begin{test} content \end{test}
\begin{test} content \end{test}
% \begin{test} content \end{test}
\end{document}

答案2

expl3使用并写入文件的粗略版本\jobname .wq

\documentclass{article}
\usepackage{xparse}
\usepackage{hyperref}

\ExplSyntaxOn
\int_new:N \g_test_int
\int_gset:Nn \g_test_int {0}
\tl_new:N \g_test_tl
\iow_new:N \l_myout_iow
\AtEndDocument{
  \iow_open:Nn \l_myout_iow {\c_sys_jobname_str .wq}
  \iow_now:Nx \l_myout_iow {\token_to_str:N \def \token_to_str:N \toshow{\g_test_tl}}
  \iow_close:N \l_myout_iow
}

\NewDocumentEnvironment {test} {}
{
  \int_gincr:N \g_test_int
  \customlabel{test\c_colon_str\int_use:N \g_test_int}{\int_use:N \g_test_int}
  \int_compare:nT
    {\g_test_int > 1}
    {
      \tl_gput_right:Nx \g_test_tl {\token_to_str:N \ref{test:\int_use:N \g_test_int}}
    }
  \par\noindent\int_use:N \g_test_int.\hspace{1em}%
} {}

\NewDocumentCommand {\myinput} {} {
  \file_if_exist:nT { \c_sys_jobname_str .wq }
    { \file_input:n { \c_sys_jobname_str .wq } }
}
\ExplSyntaxOff
\makeatletter
\newcommand{\customlabel}[2]{%
  \protected@write \@auxout {}{\string \newlabel {#1}{{#2}{\thepage}{#2}{#1}{}} }%
  \hypertarget{#1}{}
}
\def\toshow{}
\makeatother

\begin{document}
Ref here with some conditions such as \verb|\thectest > 1|

\myinput
\toshow

\begin{test}
  first
\end{test}
\begin{test}
  second
\end{test}
\newpage
\begin{test}
  third
\end{test}
\end{document}

相关内容