我有一个文档,其中许多值都是通过 定义在一个单独的文件中的\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 得出:
哪里\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}
)。