识别从输入和新命令自动生成的文本片段

识别从输入和新命令自动生成的文本片段

我有一个文档,其中许多值都是通过 定义在一个单独的文件中的\newcommand,并使用 添加到主文档的\input序言中。包含的文件是一个程序的输出,定义了 50 多个新命令,其中大多数只是数字。

为了识别哪些文本是自动生成的,我更改了程序,用灰色框中的文本创建变量,如下所示:

\newcommand{\StemLoopStart}{\colorbox[gray]{0.8}{35}}
\newcommand{\StemLoopEnd}{\colorbox[gray]{0.8}{50}}

\fboxsep就我的情况而言,由于行距中包含这些值的问题,我还必须将其设置为较小的数字,但基本上,这解决了我的问题。

但是,我现在尝试使用该fp包对这些值执行计算,但显然不起作用。

那么,有没有其他方法可以做到这一点,并且仍然允许我进行计算?我可以再次更改程序,以便每个变量输出两个命令,一个用于文本,另一个用于计算,甚至可以让程序进行计算并自行创建变量。

编辑:

以下是文档示例:

\documentclass[10pt,a4paper,onecolumn,article]{memoir}

%% A lot of other extra packages being loadded and configuration

\usepackage{color}
\usepackage{fp}

%% each of following files is generated automatically and may have
%% more than 50 new commands. A typical file would be:
%%
%%  \newcommand{\StemLoopStart}{\colorbox[gray]{0.8}{35}}
%%  \newcommand{\StemLoopEnd}{\colorbox[gray]{0.8}{50}}
%%
%% repeated many times, with different variable names

\input{results/variables-align_results}
\input{results/variables-cluster_stats}
\input{results/variables-protein_stats}
\input{results/variables-utr}
\input{data/variables-Marzluff-stats}

\begin{document}

  %% in the vast majority of the cases I will want text to be displayed
  %% in gray so the following will work fine
  Chicken histone genes have a stem loop starting at \StemLoopStart{}
  blah blah blah.

  %% However, in very few cases, I want to make some calculations
  \FPeval{StemLoopLength}{clip(\StemLoopEnd{}-\StemLoopStart{})}
  The typical length of an histone stem loop is \StemmLoopLength{}
  which ...

\end{document}

计算不会成功,因为StemLoopEnd它不仅仅是一个数字。而且因为变量很多,而且我在文本中使用了其中的大部分变量,所以colorbox每次都使用它们,或者在序言中手动重新定义它们,都不是一个可行的解决方案。

另一方面,虽然只需要进行很少的计算,但我认为不可能撤消颜色框。此外,在某些情况下,程序无法更改为发出非颜色框,无论是全部还是全部。

那么,除了让程序为每个变量发布一个彩色盒版本和非彩色盒版本之外,还有其他方法可以做到这一点吗?

答案1

另一个选项是,当你在 中时重新定义颜色\FPeval。这样,你的命令定义为:

\newcommand{\StemLoopStart}{\ColorBox{35}}
\newcommand{\StemLoopEnd}{\ColorBox{50}}

我定义的地方:

\newcommand{\ColorBox}[1]{\colorbox[gray]{0.8}{#1}}.

然后,\begin{document}您可以重新定义\FPeval以禁用此功能\ColorBox,然后恢复定义:

\let\OldFPeval\FPeval
\renewcommand\FPeval[2]{%
    \renewcommand{\ColorBox}[1]{##1}%
    \OldFPeval{#1}{#2}%
    \renewcommand{\ColorBox}[1]{\colorbox[gray]{0.8}{##1}}%
}

进一步的增强是提供一个\FPeval*,然后将突出显示添加到计算的数字:

\let\OldFPeval\FPeval
\makeatletter
\RenewDocumentCommand{\FPeval}{s m m}{%
    \renewcommand{\ColorBox}[1]{##1}%
    \IfBooleanTF{#1}{%
        \OldFPeval{#2@NoColor}{#3}%
        \expandafter\newcommand\csname#2\endcsname{\ColorBox{\csname#2@NoColor\endcsname}}%
        
    }{%
        \OldFPeval{#2}{#3}%
    }%
    \renewcommand{\ColorBox}[1]{\colorbox[gray]{0.8}{##1}}%
}
\makeatother

然后 MWE 得出:

enter image description here

哪里\FPeval{StemLoopLength}{...}没有突出显示,但\FPeval*{StemLoopLengthWithColor}{...}被突出显示。

笔记:

  • filecontents曾是仅有的用于将此示例打包成完全可编译的示例。实际示例中不需要它。

代码:

\documentclass{article}

%% each of following files is generated automatically and may have
%% more than 50 new commands. A typical file would be:
%%
%%  \newcommand{\StemLoopStart}{\colorbox[gray]{0.8}{35}}
%%  \newcommand{\StemLoopEnd}{\colorbox[gray]{0.8}{50}}
%%
%% repeated many times, with different variable names
%%

%\usepackage{file contents}% Commented out to prevent overwrite of variables-align_results.tex
\begin{filecontents*}{variables-align_results.tex}
    \newcommand{\StemLoopStart}{\ColorBox{35}}
    \newcommand{\StemLoopEnd}{\ColorBox{50}}
\end{filecontents*}
\fboxsep=1pt

%% A lot of other extra packages being loaded and configuration

\usepackage{xcolor}
\usepackage{xparse}
\usepackage{fp}


\input{variables-align_results}
%\input{results/variables-align_results}
%\input{results/variables-cluster_stats}
%\input{results/variables-protein_stats}
%\input{results/variables-utr}
%\input{data/variables-Marzluff-stats}

\newcommand{\ColorBox}[1]{\colorbox[gray]{0.8}{#1}}%

\let\OldFPeval\FPeval
\makeatletter
\RenewDocumentCommand{\FPeval}{s m m}{%
    \renewcommand{\ColorBox}[1]{##1}%
    \IfBooleanTF{#1}{%
        \OldFPeval{#2@NoColor}{#3}%
        \expandafter\newcommand\csname#2\endcsname{\ColorBox{\csname#2@NoColor\endcsname}}%
        
    }{%
        \OldFPeval{#2}{#3}%
    }%
    \renewcommand{\ColorBox}[1]{\colorbox[gray]{0.8}{##1}}%
}
\makeatother

\begin{document}

  %% in the vast majority of the cases I will want text to be displayed
  %% in gray so the following will work fine
  Chicken histone genes have a stem loop starting at \StemLoopStart{}
  blah blah blah.

  %% However, in very few cases, I want to make some calculations
  \FPeval{StemLoopLength}{clip(\StemLoopEnd{}-\StemLoopStart{})}%
  The typical length of an histone stem loop is \StemLoopLength{}
  which makes the end at \StemLoopEnd.


  %% Using the \FPeval* will highlight that value in the output.
  \FPeval*{StemLoopLengthWithColor}{clip(\StemLoopEnd{}-\StemLoopStart{})}%
  The typical length of an histone stem loop is \StemLoopLengthWithColor{}
  which makes the end at \StemLoopEnd.
\end{document}

答案2

说实话,你的问题不是很清楚(它总是有助于获得完整的文档进行测试)。

但似乎你可以让程序写

\newcommand{\StemLoopStart}{\foo{35}}

然后本地有

\newcommand\foo[1]{\colorbox[gray]{0.8}{#1}}

当你想要颜色和

然后本地有

\newcommand\foo[1]{#1}

当你想要的是裸数字时。

我无法猜测你最后评论的意图

然而,我真正希望的是序言中的内容如下:

\colorbox[gray]{0.8}{\input{program-output}}

\colorbox[gray]{0.8}{\input{program-output}} 可能已经是合法的语法,也可能不是,这取决于要输入的文件中的内容,或者也许你想要

\colorbox[gray]{0.8}{\parbox{\textwidth}{\input{program-output}}}

将多行材料放入一个框中,但无论哪种方式,它都会进入文档主体(之后\begin{document})而不是序言部分(之前\begin{document})。

相关内容