
Я ввожу много таблиц в tex-файл и хочу заменить «Стандартные ошибки в скобках» в каждой таблице на «Все, что захочу».
пример
\documentclass[12pt,a4paper]{article}
\usepackage[UTF8]{ctex}
\begin{document}
\input{table.tex}
\input{table.tex}
\end{document}
таблица.tex
\begin{table}[htbp]\centering
\def\sym#1{\ifmmode^{#1}\else\(^{#1}\)\fi}
\caption{table \label{tab3}}
\begin{tabular}{l*{3}{c}}
\hline\hline
&\multicolumn{1}{c}{(1)E}&\multicolumn{1}{c}{(2)W}&\multicolumn{1}{c}{(3)M}\\
\hline
ln$\chi$ & 3.163\sym{***}& 4.133\sym{***}& 2.017\sym{***}\\
& (0.696) & (0.451) & (0.442) \\
\hline
FE & Y & Y & Y \\
N & 1005 & 980 & 825 \\
R2 & 0.660 & 0.583 & 0.624 \\
\hline\hline
\multicolumn{4}{l}{\footnotesize Standard errors in parentheses}\\
\multicolumn{4}{l}{\footnotesize \sym{*} \(p<0.05\), \sym{**} \(p<0.01\), \sym{***} \(p<0.001\)}\\
\end{tabular}
\end{table}
IDE:Texpad 1.731
Двигатель: Xelatex, BibTex
решение1
Если использование LuaLaTeX является для вас вариантом, то вам может подойти подход, показанный в следующем примере. Функция Lua, названная dosub
, настроена для выполнения операций подстановки строк, а код LaTeX предоставляется для ограничения работы этой функции средами table
. Таким образом, экземпляры строки "Стандартные ошибки в скобках", которые могут возникнуть вне table
сред, остаются нетронутыми.
% !TeX program = lualatex
\RequirePackage{filecontents}
%% create the files 'table1.tex' and 'table2.tex'
\begin{filecontents}{table1.tex}
\begin{table}[htbp]
\centering
\def\sym#1{\ifmmode^{#1}\else\(^{#1}\)\fi}
\caption{A first table \label{tab1}}
\begin{tabular}{l*{3}{c}}
\hline\hline
&\multicolumn{1}{c}{(1)E}&\multicolumn{1}{c}{(2)W}&\multicolumn{1}{c}{(3)M}\\
\hline
$\ln\chi$ & 3.163\sym{***}& 4.133\sym{***}& 2.017\sym{***}\\
& (0.696) & (0.451) & (0.442) \\
\hline
FE & Y & Y & Y \\
N & 1005 & 980 & 825 \\
R\sym{2} & 0.660 & 0.583 & 0.624 \\
\hline\hline
\multicolumn{4}{l}{\footnotesize Standard errors in parentheses}\\
\multicolumn{4}{l}{\footnotesize \sym{*} \(p<0.05\), \sym{**} \(p<0.01\), \sym{***} \(p<0.001\)}\\
\end{tabular}
\end{table}
\end{filecontents}
\begin{filecontents}{table2.tex}
\begin{table}[htbp]
\centering
\def\sym#1{\ifmmode^{#1}\else\(^{#1}\)\fi}
\caption{A second table \label{tab2}}
\begin{tabular}{l*{3}{c}}
\hline\hline
&\multicolumn{1}{c}{(1)A}&\multicolumn{1}{c}{(2)B}&\multicolumn{1}{c}{(3)C}\\
\hline
$\ln\chi$ & 3.163\sym{***}& 4.133\sym{***}& 2.017\sym{***}\\
& (0.696) & (0.451) & (0.442) \\
\hline
FE & Y & Y & Y \\
N & 1005 & 980 & 825 \\
R\sym{2} & 0.660 & 0.583 & 0.624 \\
\hline\hline
\multicolumn{4}{l}{\footnotesize Standard errors in parentheses}\\
\multicolumn{4}{l}{\footnotesize \sym{*} \(p<0.05\), \sym{**} \(p<0.01\), \sym{***} \(p<0.001\)}\\
\end{tabular}
\end{table}
\end{filecontents}
\documentclass[12pt,a4paper]{article}
%%\usepackage[UTF8]{ctex}
%>>>> --- new code starts here ---
\usepackage{luacode,etoolbox}
\begin{luacode}
function dosub ( s )
return ( string.gsub ( s , "Standard errors in parentheses",
"Anything I want" ) )
end
\end{luacode}
\AtBeginEnvironment{table}{\directlua{
luatexbase.add_to_callback("process_input_buffer", dosub, "dosub" ) }}
\AtEndEnvironment{table}{\directlua{
luatexbase.remove_from_callback("process_input_buffer", "dosub" ) }}
%<<<< --- new code ends here ---
\begin{document}
\input table1
This instance of ``Standard errors in parentheses'' is not modified.
\input table2
\end{document}
решение2
Я бы использовал GNU grep
и GNU perl
для этого, если вы используете систему на базе Unix.Если вы планируете заменить произвольный текст в произвольном количестве файлов, вам понадобятся навыки работы с терминалом командной строки.
Если вы используете DOS, вы можете просто установить что-то вроде Babun для быстрой минимальной виртуальной машины Linux и эмулятора терминала.
Настроить симуляцию в пустой папке
1. Создайте 10 таблиц с желаемой строкой
for i in $(echo table{01..10}.tex); do touch $i && echo "Standard errors in parentheses & col2 & col3 \\\\" > $i;done
2. Рекурсивное использование регулярных выражений (диалект Perl) для составления списка совпадений (в целях проверки)
grep -Prn 'Standard errors in parentheses'
3. Рекурсивная замена текста с использованием Perl и вывода Grep
perl -i -pe 's/Standard errors in parentheses/whatever/g' $(grep -Prl 'Standard errors in parentheses')
Примечания
Если вы хотите убедиться, что замена работает правильно, прежде чем записывать данные в файлы, вы можете записать данные в терминал.
perl -pe 's/Standard errors in parentheses/whatever/g' $(grep -Prl 'Standard errors in parentheses')
или сохраните резервную копию с расширением .bak
perl -i.bak -pe 's/Standard errors in parentheses/whatever/g' $(grep -Prl 'Standard errors in parentheses')
Я работаю с большими текстами профессионально уже несколько лет и экспериментировал с различными диалектами языка регулярных выражений. По моему опыту, Perl — самый полезный и принятый диалект.
- взгляды вперед и назад, которые чрезвычайно полезны
- нежадный оператор (укрощение заполнителей, например,
*
с помощью?)
). Вы хотите найти содержимое всех\paragraph{...}
s, но некоторые другие\macro{}
могут находиться на той же строке. Просто введите ,grep -Prn '\\paragraph\{.*?\}'
чтобы остановиться на первом}
.