如何有条件地取消注释一部分代码?

如何有条件地取消注释一部分代码?

我正在尝试设计一个可以存储多种配色方案的 tex 文件(我会一次性定义),我可以一次“激活”一个配色方案,以便快速为我的文档分配配色方案。这可能不太清楚,所以这里是我的代码:

\usepackage{xcolor}
\usepackage{sectsty}

%Current scheme
\definecolor{belux}{HTML}{3366FF}
\definecolor{underbelux}{HTML}{4477EE}

%_____________________________________________________________
%Existing schemes

\begin{comment}
%orange
\definecolor{belux}{RGB}{189,79,0}
\definecolor{underbelux}{RGB}{237,127,16}

%blue
\definecolor{belux}{HTML}{3366FF}
\definecolor{underbelux}{HTML}{3366FF}

\end{comment}

%______________________________________________________________
%Color selection for each header
\chapterfont{\color{belux}} 
\sectionfont{\color{belux}}  
\subsectionfont{\color{belux}}
\subsubsectionfont{\color{underbelux}}

\newcommand{\coloritem}[1]{\item[\textcolor{belux}{[#1]}]}
\newcommand{\undercoloritem}[1]{\item[\textcolor{underbelux}{[#1]}]}

在这里,您可以看到我的所有颜色都命名为“belux”和“underbelux”(这没有任何意义),这样当我想更改配色方案时,我不必手动更改 \xxxfont{\color{belux}} 说明中的颜色。为此,只需取消注释活动配色方案(在“活动方案”部分)。其他方案位于注释部分,以便于访问,并确保编译器不会编译所有方案。

目前的工作方式是,我必须将方案特定的“belux”颜色定义命令从“现有方案”部分复制并粘贴到“当前方案”部分。这并不是我想要的工作方式,因为从长远来看,我可能会创建许多其他方案。

我想改变这一点,以便每个方案都有一个定义的参数(一个数字或名称),我可以在本文档的开头“调用”该参数,并且当“调用”时,该参数将取消注释该特定方案的 \definecolor 命令,同时注释其余命令。

它的工作方式类似于 Java 切换指令:

switch (activescheme){
    case orange : 
        \definecolor{belux}{RGB}{189,79,0}
        \definecolor{underbelux}{RGB}{237,127,16}
    case blue :
        \definecolor{belux}{HTML}{3366FF}
        \definecolor{underbelux}{HTML}{3366FF}
    default :
         do nothing
}

好吧,这不是正确的 Java,但它可能会让您了解我希望它具有的结构。我会更改 activescheme 参数的值,以便只解锁一种配色方案,而其他配色方案将被忽略。

我不熟悉\ifxxx...\fi结构,但我认为我必须为每个方案定义一个布尔值,因此在文件开头有许多布尔值定义。以下是我根据我目前对此结构的了解可以做的:

\usepackage{xcolor}
\usepackage{sectsty}

\newif\ifblue
\newif\iforange

\bluetrue
\orangefalse

%_____________________________________________________________
%Existing schemes

%orange
\iforange
\definecolor{belux}{RGB}{189,79,0}
\definecolor{underbelux}{RGB}{237,127,16}
\fi

%blue
\ifblue
\definecolor{belux}{HTML}{3366FF}
\definecolor{underbelux}{HTML}{3366FF}
\fi

%______________________________________________________________
%Color selection for each header
\chapterfont{\color{belux}} 
\sectionfont{\color{belux}}  
\subsectionfont{\color{belux}}
\subsubsectionfont{\color{underbelux}}

\newcommand{\coloritem}[1]{\item[\textcolor{belux}{[#1]}]}
\newcommand{\undercoloritem}[1]{\item[\textcolor{underbelux}{[#1]}]}

这将是难以管理的,我应该创建多个配色方案。

所以,我的问题是:有没有其他方法可以使用\ifxxx...\fi结构来让我创建我想要的结构,或者是否有其他结构可以做到这一点?

如果您能提供任何帮助都将不胜感激,很抱歉问题这么长;)

答案1

正如第 1 页所述commentcommentable文档,您可以根据需要定义任意数量的环境,只需包含\includecomment{name of environment}\excludecomment{name of environment}选择或取消选择文档中的相应行即可。

通过它们您可以声明任意颜色组合的环境

\begin{orange}
%orange
\definecolor{belux}{RGB}{189,79,0}
\definecolor{underbelux}{RGB}{237,127,16}
\end{orange}

并将 或 不 与\includecomment{orange}或一起使用\excludecomment{orange}

\documentclass{book}
\usepackage{xcolor}
\usepackage{sectsty}
\usepackage{comment}

%Current scheme
\definecolor{belux}{HTML}{FF3366}
\definecolor{underbelux}{HTML}{EE4477}

%_____________________________________________________________
%Existing schemes

%leave one uncommented
%\includecomment{orange}
\excludecomment{orange}

%leave one uncommented
%\includecomment{blue}
\excludecomment{blue}

\begin{orange}
%orange
\definecolor{belux}{RGB}{189,79,0}
\definecolor{underbelux}{RGB}{237,127,16}
\end{orange}

\begin{blue}
%blue
\definecolor{belux}{HTML}{3366FF}
\definecolor{underbelux}{HTML}{3366FF}
\end{blue}

%______________________________________________________________
%Color selection for each header
\chapterfont{\color{belux}} 
\sectionfont{\color{belux}}  
\subsectionfont{\color{belux}}
\subsubsectionfont{\color{underbelux}}

\newcommand{\coloritem}[1]{\item[\textcolor{belux}{[#1]}]}
\newcommand{\undercoloritem}[1]{\item[\textcolor{underbelux}{[#1]}]}

\begin{document}

\chapter{First chapter}
\section{First section}
\begin{itemize}
\coloritem{A}
\coloritem{B}
\end{itemize}
\end{document}

使用前面代码中的\include...-命令的几种组合,我们得到:\exclude...

在此处输入图片描述在此处输入图片描述在此处输入图片描述

更新:

在深入研究了 CTAN 之后,我发现了一个名为布尔表达式它定义了一个switch条件。我不知道这个包,也不知道是否有更好的选择。

在这种情况下,每个颜色集都可以与用 定义的整数相关联counter

\newcounter{myColorSelector} 
\setcounter{myColorSelector}{5}

\switch[\value{myColorSelector}]
\case{=1}%orange
\definecolor{belux}{RGB}{189,79,0}
\definecolor{underbelux}{RGB}{237,127,16}
\case{=2}%blue
\definecolor{belux}{HTML}{3366FF}
\definecolor{underbelux}{HTML}{3366FF}
\otherwise%default
\definecolor{belux}{HTML}{FF3366}
\definecolor{underbelux}{HTML}{EE4477}
\endswitch

完整代码

\documentclass{book}
\usepackage{xcolor}
\usepackage{sectsty}
\usepackage{boolexpr}

%_____________________________________________________________
%Existing schemes

\newcounter{myColorSelector} \setcounter{myColorSelector}{5}

\switch[\value{myColorSelector}]
\case{=1}%orange
\definecolor{belux}{RGB}{189,79,0}
\definecolor{underbelux}{RGB}{237,127,16}
\case{=2}%blue
\definecolor{belux}{HTML}{3366FF}
\definecolor{underbelux}{HTML}{3366FF}
\otherwise%default
\definecolor{belux}{HTML}{FF3366}
\definecolor{underbelux}{HTML}{EE4477}
\endswitch

%______________________________________________________________
%Color selection for each header
\chapterfont{\color{belux}} 
\sectionfont{\color{belux}}  
\subsectionfont{\color{belux}}
\subsubsectionfont{\color{underbelux}}

\newcommand{\coloritem}[1]{\item[\textcolor{belux}{[#1]}]}
\newcommand{\undercoloritem}[1]{\item[\textcolor{underbelux}{[#1]}]}

\begin{document}

\chapter{First chapter}
\section{First section}
\begin{itemize}
\coloritem{A}
\coloritem{B}
\end{itemize}
\end{document}

答案2

我会使用键值接口来解决此问题,以完成大部分繁重的工作。此方法的优点是您可以在任何地方定义新方案,并且单个文档可以根据需要使用多个方案(尊重分组/范围)。

有多个keyval包,代码可能比我下面展示的还要花哨,但这里有一个可以完成的简单示例。宏\definescheme用于创建一个方案,用法如下:

\definescheme{<scheme-name>}{<belux-model>}{<belux-spec>}{<underbelux-model>}{<underbelux-spec>}

<scheme-name>定义方案后,可以使用宏在文档中的任何位置选择\setscheme{<scheme-name>}该方案。方案选择将从设置点应用到组末尾。

下面的简单示例说明了这一点。没有错误检查代码,任何使用键设置的值(例如,,\setscheme{orange=5}其中5是值)都会被默默丢弃。如果需要,可以扩展代码以将值用于某些特殊用途。

代码如下:

\documentclass{book}
\usepackage{xcolor}
\usepackage{sectsty}
\usepackage{keyval}

%key-handling interface
\makeatletter
\def\definescheme#1#2#3#4#5{%
  \define@key{myschemes}{#1}[]{%
    \definecolor{belux}     {#2}{#3}%
    \definecolor{underbelux}{#4}{#5}%
  }%
}%
\makeatother
\def\setscheme#1{\setkeys{myschemes}{#1}}

%Default scheme
\definecolor{belux}{HTML}{3366FF}
\definecolor{underbelux}{HTML}{4477EE}

%_____________________________________________________________
%Existing schemes
\definescheme{orange}{RGB}{189,79,0}{RGB}{237,127,16}
\definescheme{blue}{HTML}{3366FF}{HTML}{3366FF}
\definescheme{red}{RGB}{255,0,0}{RGB}{237,0,0}

%______________________________________________________________
%Color selection for each header
\chapterfont{\color{belux}} 
\sectionfont{\color{belux}}  
\subsectionfont{\color{belux}}
\subsubsectionfont{\color{underbelux}}

\newcommand{\coloritem}[1]{\item[\textcolor{belux}{[#1]}]}
\newcommand{\undercoloritem}[1]{\item[\textcolor{underbelux}{[#1]}]}

\begin{document}
\chapter{First chapter}
\section{First section}
\begin{itemize}
\coloritem{A} Test 
{ % scheme setting can obey grouping if desired
  \setscheme{orange}
  \coloritem{B} Test
}
\coloritem{C} Test
\end{itemize}
\setscheme{red}
\section{Red section}
\subsection{Also red}
\setscheme{blue}
\subsubsection{Now blue}
\end{document}

以及相应的输出:

在此处输入图片描述

答案3

尽管它很简短,我还是把这个作为答案。有时最不复杂的事情就是最好的事情,也是最可扩展的事情。

我只需创建一组文件,每个方案一个。在每个文件中定义您想要的颜色。

然后只需在文件中包含一行

\输入{colorschemepurple.tex}

答案4

这就是宏的用途。;-)

\documentclass{report}

\usepackage[paperwidth=8cm,paperheight=13cm]{geometry}

\usepackage{xcolor}
\usepackage{sectsty}

\newcommand{\currentscheme}{%
  \definecolor{belux}{HTML}{3366FF}%
  \definecolor{underbelux}{HTML}{4477EE}%
}

\newcommand{\orangescheme}{%
  \definecolor{belux}{RGB}{189,79,0}%
  \definecolor{underbelux}{RGB}{237,127,16}%
}

\newcommand{\bluescheme}{%
  \definecolor{belux}{HTML}{3366FF}%
  \definecolor{underbelux}{HTML}{3366FF}%
}

%Color selection for each header
\chapterfont{\color{belux}} 
\sectionfont{\color{belux}}  
\subsectionfont{\color{belux}}
\subsubsectionfont{\color{underbelux}}

\newcommand{\coloritem}[1]{\item[\textcolor{belux}{[#1]}]}
\newcommand{\undercoloritem}[1]{\item[\textcolor{underbelux}{[#1]}]}

\currentscheme

\begin{document}

\chapter{Title}

\section{Title}
\subsection{Title}
\subsubsection{Title}

%%% just for testing

\orangescheme

\chapter{Title}

\section{Title}
\subsection{Title}
\subsubsection{Title}

\end{document}

在此处输入图片描述

相关内容