![](/img/trans.png)
[英]TextMate Edit Latex Bundle Snippet, regex to replace non ascii-characters
[英]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.