正则表达式编辑乳胶表

时间:2013-08-03 03:08:03

标签: regex latex

我有一个LaTeX表(下面是片段),它包含每个\ underset之后的两个值(值1:标准错误;值2:估计)。我想通过将\ bf {}添加到每个\ underset之后的第二个值进行编辑,只要第二个值除以第一个值大于2或小于-2。

例如,在第一个\ underet之后(在'拦截'之后),-9.686 / 1.742是< -2,因此我希望原始的{-9.686}读作\ bf {-9.686}。我有数百个变量,因此不首选手动。我只用notepad ++工作,但如果有必要可以尝试Python。有关PC的正则表达式和/或合适平台(编辑器/解析器等)的任何提示都将非常感激。

documentclass[letter]{article}
\usepackage{amsmath, amsthm, amssymb}  % Additional math packages

\begin{document}

\begin{table}[hptb]
\begin{center}
\begin{tabular}{|l||c|c|c|c|c|c|c|} \hline

(Intercept)&$\underset{(1.742)}{-9.686}$&$\underset{(0.907)}     
{-9.085}$&$\underset{(0.663)}{-9.724}$&$\underset{(0.565)}{-9.077}$&$\underset{(0.619)} 
{-7.601}$&$\underset{(0.838)}{-5.273}$&$\underset{(1.120)}{-3.417}$\\ 
\end{tabular}
\end{center}
\end{table}
\end{document}

我希望输出表读起来像这样。

输出表:

\begin{document}

\begin{table}[hptb]
\begin{center}
\begin{tabular}{|l||c|c|c|c|c|c|c|} \hline

(Intercept)&$\underset{(1.742)}{\bf{-9.686}}$&$\underset{(0.907)}
{\bf{-9.085}}$&$\underset{(0.663)}{-9.724}$&$\underset{(0.565)}{\bf{-
-9.077}}$&$\underset{(0.619)}{\bf{-7.601}}$&$\underset{(0.838)} 
{-5.273}$&$\underset{(1.120)}{-1.417}$\\ 
\end{tabular}
\end{center}
\end{table}
\end{document}

2 个答案:

答案 0 :(得分:5)

这完全可以在LaTeX中完成......

enter image description here

\documentclass{article}
\usepackage{amsmath,collcell,array}% http://ctan.org/pkg/{amsmathm,collcell,array}
\makeatletter
\def\insertbf@$\underset#1#2${$\underset{#1}{\mathbf{#2}}$}
\newcommand{\insertbf}[1]{\expandafter\insertbf@#1}
\newcolumntype{C}{>{\collectcell\insertbf}c<{\endcollectcell}}
\makeatother
\begin{document}

\begin{table}[hptb]
  \centering
  \begin{tabular}{|l||*{7}{c|}} \hline
    (Intercept) & $\underset{(1.742)}{-9.686}$ & $\underset{(0.907)}{-9.085}$ & $\underset{(0.663)}{-9.724}$
      & $\underset{(0.565)}{-9.077}$ & $\underset{(0.619)}{-7.601}$ & $\underset{(0.838)}{-5.273}$ 
      & $\underset{(1.120)}{-3.417}$
  \end{tabular}

  \bigskip

  \begin{tabular}{|l||*{7}{C|}} \hline
    (Intercept) & $\underset{(1.742)}{-9.686}$ & $\underset{(0.907)}{-9.085}$ & $\underset{(0.663)}{-9.724}$
      & $\underset{(0.565)}{-9.077}$ & $\underset{(0.619)}{-7.601}$ & $\underset{(0.838)}{-5.273}$ 
      & $\underset{(1.120)}{-3.417}$
  \end{tabular}  
\end{table}
\end{document}

在上面的示例中,两个表与使用常规c - 列规范的顶部表相同,而底部表使用新定义的C - 列规范。后者拦截\underset的设置以修改第二个参数的字体。

collcell package用于捕获第2-8列中每个单元格的内容。它们必须与$\underset{#1}{#2}$形式完全匹配,以便将其转换为$\underset{#1}{\mathbf{#2}}$array package通过新定义的列简化了单元格集合(简化了代码)。

有些注意事项:

  • 我使用了复制列说明符*{<num>}{<col spec>},它重复列规范<col spec>总共<num>次。它使代码更具可读性。

  • 使用\mathbf代替与文字相关的\bf。请参阅Does it matter if I use \textit or \it, \bfseries or \bf, etc.Will two-letter font style commands (\bf, \it, …) ever be resurrected in LaTeX?

  • 不要反复复制相同的原始概念,而是定义一个可以使用的宏(参见Consistent typography)。通过这种方式,它可以让您了解内容,如果您改变主意,可以轻松操作。例如,

    \newcommand{\stderrest}[2]{$\underset{(#1)}{#2}$}% \stderrest{<stderr>}{<est>}
    

    然后在需要此类设置的任何地方使用\stderrest{<stderr>}{<est>}。这样,格式化的更新就像

    一样简单
    \renewcommand{\stderrest}[2]{$\underset{(#1)}{\mathbf{#2}}$}% \stderrest{<stderr>}{<est>}
    

    你已经完成了。

  • 不要在浮动内使用center环境;而是使用\centering。作为参考,请参阅Should I use \center or \centering for figures and tables?

  • 使用\makeatletter ... \makeatother对只是因为我定义了一个与您的规范输入相匹配的特定“内部”命令。这不是必要的,可以改变。但有关详细信息,请参阅What do \makeatletter and \makeatother do?

  • 如果您在新定义的C - 列中有一个没有$\underset{#1}{#2}$表格的单元格,则需要使用\multicolumn{1}{c|}{..}来避免收集该单元格。


  

...无论如何都要添加一个条件语句,只在\mathbf的{​​{1}}之前插入{#2}当且仅当{#2}的绝对值除以{#1}大于2?截至目前,它为\mathbf中的每个值添加了{#2}

对于变量的条件格式,这里有一个选项:

enter image description here

\documentclass{article}
\usepackage{amsmath,collcell,array}% http://ctan.org/pkg/{amsmathm,collcell,array}
\usepackage[nomessages]{fp}% http://ctan.org/pkg/fp
\makeatletter
\let\stderr@format\relax
\def\stripparen@(#1){#1}% Remove parentheses
\def\insertbf@$\underset#1#2${%
  \FPabs\resultA{#2}% Absolute value of #2
  \edef\resultB{\stripparen@#1}% Extract std err
  \FPeval\result{\resultA / \resultB}% Divide est / std err
  \FPifgt\result{2}\let\stderr@format\mathbf\fi%
  $\underset{#1}{\stderr@format{#2}}$}%
\newcommand{\insertbf}[1]{\expandafter\insertbf@#1}
\newcolumntype{C}{>{\collectcell\insertbf}c<{\endcollectcell}}
\makeatother
\begin{document}

\begin{table}[hptb]
  \centering
  \begin{tabular}{|l||*{7}{c|}} \hline
    (Intercept) & $\underset{(1.742)}{-9.686}$ & $\underset{(0.907)}{-9.085}$ & $\underset{(0.663)}{-9.724}$
      & $\underset{(0.565)}{-9.077}$ & $\underset{(0.619)}{-7.601}$ & $\underset{(0.838)}{-5.273}$ 
      & $\underset{(1.120)}{-3.417}$
  \end{tabular}

  \bigskip

  \begin{tabular}{|l||*{7}{C|}} \hline
    (Intercept) & $\underset{(1.742)}{-9.686}$ & $\underset{(0.907)}{-9.085}$ & $\underset{(0.663)}{-9.724}$
      & $\underset{(0.565)}{-9.077}$ & $\underset{(0.619)}{-7.601}$ & $\underset{(0.838)}{-5.273}$ 
      & $\underset{(1.120)}{-3.417}$
  \end{tabular}  

  \bigskip

  \begin{tabular}{|l||*{7}{C|}} \hline
    (Intercept) & $\underset{(1.742)}{-2.686}$ & $\underset{(0.907)}{-9.085}$ & $\underset{(0.663)}{-9.724}$
      & $\underset{(0.565)}{-9.077}$ & $\underset{(0.619)}{-7.601}$ & $\underset{(0.838)}{-1.273}$ 
      & $\underset{(1.120)}{-3.417}$
  \end{tabular}  
\end{table}
\end{document}

fp提供定点算术来调节某些变量的值。我确定更新的代码是不言自明的。

答案 1 :(得分:1)

Python的一个例子:

#!/usr/bin/python

import re

data = r'''documentclass[letter]{article}
\usepackage{amsmath, amsthm, amssymb}  % Additional math packages

\begin{document}

\begin{table}[hptb]
\begin{center}
\begin{tabular}{|l||c|c|c|c|c|c|c|} \hline

(Intercept)&$\underset{(1.742)}{-9.686}$&$\underset{(0.907)}     
{-9.085}$&$\underset{(0.663)}{-9.724}$&$\underset{(0.565)}{-9.077}$&$\underset{(0.619)} 
{-7.601}$&$\underset{(0.838)}{-5.273}$&$\underset{(1.120)}{-3.417}$\\ 
\end{tabular}
\end{center}
\end{table}
\end{document}'''

print re.sub(r'(\\underset{\()(-?[0-9]+(?:\.[0-9]+)?)(\)}\s*{)(-?[0-9]+(?:\.[0-9]+)?)(?=}\$)',
    lambda m: m.group(1)+m.group(2)+m.group(3)+'\\bf{'+m.group(4)+'}'
        if abs(float(m.group(4))/float(m.group(2)))>2 else m.group(0), data)

简而言之,我们的想法是捕获两个值以传递给lambda函数,该函数将商的绝对值与2进行比较并返回修改后的字符串或整个匹配。

相关问题