我想在文档开头显示一些参考资料,并附带一些条件。以下是示例代码
\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}