依赖于参数的宏

依赖于参数的宏

我想编写一个privatecomment其行为取决于全局参数的宏show

例如,在 中.tex,我可以写入\privatecomment{Here is a comment}。当我设置show为时true,它会打印Here is a comment.pdf否则,它什么都不打印。

谁能告诉我如何实现这一点?

答案1

你可以做

\newif\ifshow
\showtrue
\def\privatecomment#1{\ifshow#1\fi}

但实际上这样做更简单、更有效

\def\showtrue{\def\privatecomment##1{##1}}
\def\showfalse{\def\privatecomment##1{}}
\showtrue

答案2

一个简单的 if 开关,没有任何多余的装饰。

\documentclass{article}  
\newif\ifshowmycomments
\showmycommentstrue
\long\def\privatecomment#1{\ifshowmycomments#1\fi}
\begin{document}  
\privatecomment{Shows by default}
\showmycommentsfalse

\privatecomment{Turned off}
\showmycommentstrue

\privatecomment{On again.}

\end{document}  

答案3

正确的方法是使用\@bsphack\@esphack

\documentclass{article}
\usepackage{xcolor}

\newif\ifshowprivatecomments
\showprivatecommentstrue
\makeatletter
\newcommand{\privatecomment}[1]{%
  \ifshowprivatecomments
    \textcolor{red!50}{#1}%
  \else
    \@bsphack\@esphack
  \fi
}
\makeatother

\begin{document}  

This is text \privatecomment{This is a comment}
and the text continues.

\privatecomment{A comment between paragraphs}

Some text again.

\showprivatecommentsfalse

This is text \privatecomment{This is a comment}
and the text continues.

\privatecomment{A comment between paragraphs}

Some text again.

\end{document} 

在此处输入图片描述

答案4

在我的课程文档中,我设置了许多标志来显示答案或隐藏答案,以创建略有不同的文档版本,用于各种目的。我通常不喜欢进入文档并更改某些内容以进行这些修改。相反,我创建一个目录,./.design在其中放置各种文件,这些文件的存在(或不存在)决定了哪些修改会生效。

我的答案是关于如何在命令行中构建一个界面以方便更改文件的编译方式。其他答案向您展示了如何在进行更改后实施这些更改。

例如,我的./.design目录中可能有以下文件:

show_answers.true
two_column_doc.false
compile_practice_version.false

这样,我一眼就能看到我是如何设置文档的。我还创建了一个 perl 脚本,它允许我轻松切换或更改这些设置(出于我个人目的,并非所有设置都是二进制的)。

为了方便您参考,下面是按照我的想法解决您问题的方法。

首先是一些 perl 代码:

#!/usr/bin/perl
use strict 'vars';
&MAIN(@ARGV);
sub MAIN {
   my $fh_true  = "./.design/show_comment.true";
   my $fh_false = "./.design/show_comment.false";
   if ( -e $fh_true )
     {
       system("mv $fh_true $fh_false");
     }
   elsif ( -e $fh_false )
     {
       system("mv $fh_false $fh_true");
     }
   else
     {
       system ("touch $fh_true");
     }
}

可以从命令行调用 perl 代码。它执行两项操作之一,要么在文件名之间切换./.design/show_comment.true,要么./.design/show_comment.false 或者如果两个文件都不存在,则创建./.design/show_comment.true默认值。可以将所有复杂程度添加到此类 perl 脚本中。

然后,您想要创建的文档可以写成

\documentclass{article}

\makeatletter
\newcommand\privatecomment[1]{%%
  \IfFileExists{./.design/show_comment.true}
    {``#1''}
    {\unskip\@bsphack\@esphack}}
\makeatother

\begin{document}

  Hello \privatecomment{world} and more stuff.

\end{document}

./.design/show_comment.true创建后的结果如下:

在此处输入图片描述

这个特定的定义存在一些问题。当./.design/show_comment.true不存在时,我们得到以下结果:

在此处输入图片描述

相关内容