是否有任何命令/包/环境可以使一些代码在输出文件中产生可见的效果,就好像它没有被编写而是实现了其内部功能一样?例如,
\documentclass{memoir}
\newcounter{sol}
\addtocounter{\thesol}{-1}
\newenvironment{sol}[2]%
{\refstepcounter{sol}\index{\textbf{#2}}%
\addcontentsline{toc}{section}{\protect #1}%
\centering\textsc{\Large\textbf{#1}}\\%
\noindent By: \textbf{#2}\\%
\begin{raggedright}\ignorespaces}%
{\end{raggedright}\ignorespacesafterend}
\begin{document}
This document shows \ref{sol:num} sols.
.
\begin{sol}{}{}
\label{sol:num}
\end{sol}
.
\end{document}
在上面的代码中,最后一个sol
环境用于sol
通过标记和引用来计数文档中除其自身之外的所有现有环境(通过在计数器上加 -1 来表示)。但是,该sol
环境在输出文件中提供了可见的效果,例如打印字符By:
并提供 ToC 和 Index 条目,正如我们在其定义中看到的那样。
答案1
您似乎只对计算 s 的数量感兴趣sol
。为此,已经有一个提供此功能的包:totcount
\documentclass{memoir}
\usepackage{totcount}
\newtotcounter{sol}% Register sol as a "total" counter
\newenvironment{sol}[2]%
{\refstepcounter{sol}\index{\textbf{#2}}%
\addcontentsline{toc}{section}{\protect #1}%
{\centering\Large\bfseries #1\par}%
\noindent By: \textbf{#2}\par%
\begin{raggedright}\ignorespaces}%
{\end{raggedright}\ignorespacesafterend}
\begin{document}
This document shows \total{sol} sols.
\begin{sol}{First}{Second}
Another solution
\end{sol}
\end{document}
当然,如果您想从这个计数中删除一个(为了排除最后一个),那么请按照之前的方式进行操作,即\addtocounter{sol}{-1}
在创建计数器后进行设置。
如果出于某种原因,这种方法对您不起作用,另一种方法可能是挂接到\AtDocumentEnd
。由于您只会将引用用于计数目的,因此这应该足够了:
\makeatletter
\AtEndDocument{%
\def\@currentlabel{\thesol}% Store the value (representation) of sol
\label{sol:num}% Mark with a label
}
\makeatother
这允许您在文档中使用\ref{sol:num}
将显示 s 总数的sol
。当然,如果您希望排除最后一个,您可以按照上面建议的相同步骤进行操作。
使用这两种技术时,第一次运行时都需要编译两次才能使引用稳定下来。这也适用于引用值的任何变化。