如何在发挥文档“隐身”功能的同时,使文档输出文件上的一些可见效果变得“不可见”或者无效?

如何在发挥文档“隐身”功能的同时,使文档输出文件上的一些可见效果变得“不可见”或者无效?

是否有任何命令/包/环境可以使一些代码在输出文件中产生可见的效果,就好像它没有被编写而是实现了其内部功能一样?例如,

\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。当然,如果您希望排除最后一个,您可以按照上面建议的相同步骤进行操作。

使用这两种技术时,第一次运行时都需要编译两次才能使引用稳定下来。这也适用于引用值的任何变化。

相关内容