簡體   English   中英

正則表達式編輯乳膠表

[英]Regex to edit latex tables

我有一個LaTeX表(下面是代碼段),每個\\ underset后都包含兩個值(值1:標准誤差;值2:估計)。 我想通過在每個\\ underset之后的第二個值添加\\ bf {}來進行編輯,只要第二個值除以第一個值大於2或小於-2。

例如,在第一個\\ underset之后(“攔截”之后),-9.686 / 1.742為<-2,因此我希望原始的{-9.686}讀為\\ bf {-9.686}。 我有數百個變量,因此手動進行操作不是首選。 我只使用w / 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}

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

在此處輸入圖片說明

\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軟件包用於捕獲第2-8列中每個單元格的內容。 它們必須完全匹配形式$\\underset{#1}{#2}$以便可以將其轉換為$\\underset{#1}{\\mathbf{#2}}$ array通過新定義的列簡化了單元格的收集(簡化了代碼)。

注意事項:

  • 我使用了復制列說明符*{<num>}{<col spec>} ,該列重復列規范<col spec>總共<num>次。 它使代碼更具可讀性。

  • 使用\\mathbf而不是與文本相關的\\bf 請參閱是否使用\\textit\\it\\bfseries\\bf等有關系,並且兩個字母的字體樣式命令( \\bf\\it …)是否會在LaTeX中復活?

  • 定義一個可以使用的宏,而不是一遍又一遍地復制相同的原始概念(請參閱一致的印刷術 )。 這樣,您就可以了解其中的內容,如果您改變主意就可以輕松地對其進行操作。 例如,

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

    然后在需要此類設置的地方使用\\stderrest{<stderr>}{<est>} 這樣,格式更新就像

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

    到此為止。

  • 不要在浮子內部使用center環境; 寧可使用\\centering 作為參考,請參見我應該對圖形和表格使用\\center還是\\centering

  • 使用\\makeatletter ... \\makeatother對僅是因為我定義了一個與您的規范輸入相匹配的特定“內部”命令。 它不是真正必要的,可以更改。 但是有關此的更多信息,請參見\\makeatletter\\makeatother做什么?

  • 如果新定義的C列中的某個單元格沒有$\\underset{#1}{#2}$形式,則需要使用\\multicolumn{1}{c|}{..}避免被收集。


...是否總有條件語句僅在{#2}除以{#1}的絕對值大於2時才在\\mathbf {#2}之前插入\\mathbf 到目前為止,它將\\mathbf添加到{#2}每個值中。

對於變量的條件格式,這是一個選項:

在此處輸入圖片說明

\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為某些變量的值提供定點算法。 我確定更新后的代碼是不言自明的。

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進行比較,並返回修改后的字符串或整個匹配項。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM