Удостоверьтесь свои работы команды из командной строки сначала
/usr/bin/python /home/MyName/WeatherProject/HOURLY/windDirExtract.py
Затем попробуйте то же в crontab
*/10 * * * * /usr/bin/python /home/MyName/WeatherProject/HOURLY/windDirExtract.py
Итак, во-первых, вам нужно добавить метки к вашему документу (что, тем не менее, хорошо):
Далее запустите латекс, как всегда, допустим, он называется [112709]walla.tex[112710]. Теперь вы запускаете этот маленький питоновый скрипт:
Вызовите его [112711]find_tex_labels[112712], сделайте его исполняемым, и запустите его как [112713]find_tex_labels walla > walla_annotated.tex[112714] (обратите внимание, в аргументах нет расширений).
На выходе у вас будет аннотированный LaTeX-файл:
(1) Я обещаю доработать его много раз. Затем, учитывая, что я единственный, кто его использует, я исправляю ошибки, если и когда они появляются... и никогда не нахожу времени, чтобы их почистить. [112428]
Относительно сложная часть состоит в том, что вам нужно буферизовать закомментированную строку, чтобы увидеть, его нужно обновить, если следующая строка является индикатором раздела. Было бы проще, если бы эти данные находились в той же или следующей строке.
Следующее должно вам помочь. Его можно вызвать как python script.py input output
или вы можете оставить вывод, и он будет записывать в стандартный вывод. Не выполняйте `python script.py xx.tex xx.tex ', а запишите во временный файл и скопируйте его обратно в исходный.
Это обновляет существующие строки формы % x.y.z остальная часть комментария
, оставляя остальную часть комментария
нетронутой. Если такого комментария еще нет, вставьте его. Специальные комментарии должны начинаться в начале строки, как и команды разделения.
import sys
class ProcessLaTeX:
def __init__(self, ifp, ofp):
self.ofp = ofp
self.prev_comment = None
self.level = []
for line in ifp:
self.process(line)
# emit last line if comment
if self.prev_comment:
self.ofp.write(self.prev_comment)
def output(self, line):
pass
def process(self, line):
if line[0] == '%':
# store comment line, emitting any previously stored line
if self.prev_comment:
self.ofp.write(self.prev_comment)
self.prev_comment = line
return
lvl = self.check_level(line)
if lvl > -1:
self.output_level_comment(lvl)
if self.prev_comment:
self.ofp.write(self.prev_comment)
self.prev_comment = None
self.ofp.write(line)
def output_level_comment(self, lvl):
if self.prev_comment: # check if we overwrite an old one
# do not use the starting '%' and final newline
words = self.prev_comment[1:-1].split(' ', 1)
for c in words[0]:
if c not in '01234567890.':
self.ofp.write(self.prev_comment)
self.prev_comment = None
break
self.level.append(0) # in case this is a deeper level
self.level[lvl] += 1
self.level = self.level[:lvl+1] # cut of excess levels
lvls = '%' + '.'.join([str(l) for l in self.level])
if self.prev_comment: # overwrite the previous words[1]
words[0] = lvls
outs = ' '.join(words)
if not outs[-1] == '\n':
outs += '\n'
self.prev_comment = None
else:
outs = lvls + '\n'
self.ofp.write(outs)
def check_level(self, line):
if line and not line[0] == '\\':
return -1
cmd = line[1:].split('{', 1)[0]
try:
res = ['section', 'subsection', 'subsubsection',
'paragraph', 'subparagraph'].index(cmd)
except ValueError:
return -1
return res
out = sys.stdout if len(sys.argv) < 3 else open(sys.argv[2], 'w')
pl = ProcessLaTeX(open(sys.argv[1]), out)
Как мне кажется, вы ищете параметр nl
разделителя разделов . Из информация nl
:
nl
разбивает свой ввод на (логические) страницы; по умолчанию номер строки сбрасывается на 1 в верхней части каждой логической страницы. nl
обрабатывает все входные файлы как единый документ; он не сбрасывает номера строк или логических страниц между файлами.
Логическая страница состоит из трех разделов: заголовок , основной текст и нижний колонтитул . Любой из разделов может быть пустым. Каждую из них можно пронумеровать по стилю, отличному от других.
Начало разделов логических страниц указывается во входном файле строкой, содержащей ровно одну из этих строк-разделителей:
\: \: \:
- начало заголовка; \: \:
- начало тела; \:
- начало нижнего колонтитула. Вы можете установить nl
elimiter логической страницы -d
в командной строке, например:
nl -dCC <infile
... где CC представляют любые два символа для замены \:
, как указано в документации. Учитывая ваш ввод, я не думаю, что это необходимо - мы можем просто вставить значения по умолчанию, где это применимо, с небольшой фильтрацией ввода. Вот nl
и sed
, объединенные в функцию оболочки, которую я написал, предназначенную для рекурсивной фильтрации:
sd() { n='
'; nl -bp"^\\\\$1section" -w1 -s"$n\:\:\:$n" |
sed '/./!d;/^[0-9]/!s/^[[:blank:]]*//;/^%[0-9.]*$/h;t
s/./%&/;x;/%/G;s//./2;/\n.*/h;s///;x;s/\n//;N
s/\(\(.*\)\(\n\)\)\(\(.*\)\(..\)\)/\4\3\1\5/'
}
Я отправил ей что-то вроде данных из вашего примера и отправил ее вывод обратно в несколько раз:
sd <<\IN |sd sub | sd subsub | sd subsubsub
\begin{document}
\section{}
some ordinary lines
\subsection{}
whatever
\subsubsection{}
\subsection{}
\subsubsection{}
\subsubsubsection{}
\section{}
\subsection{}
\end{document}
IN
Выполнить, как указано выше, он напечатает:
\begin{document}
%1
\section{}
some ordinary lines
%1.1
\subsection{}
whatever
%1.1.1
\subsubsection{}
%1.2
\subsection{}
%1.2.1
\subsubsection{}
\:\:\:
%1.2.1.1
\:\:
\subsubsubsection{}
%2
\section{}
%2.1
\subsection{}
\end{document}
Как видите, задание фильтрации не полностью завершено, но, похоже, оно выполняет свою работу. nl
нумерует -b
код своего ввода на основе -bp'attern '
, который он загружается - и начинает свой счет заново для каждой логической страницы - как ограничено строкой, состоящей из только разделителя заголовка логической страницы \: \: \:
.
Итак ... sed
фильтрует свой вывод, который уже включает разделитель, установленный в nl
s -s
eparator arg и в основном sed
просто немного переставляет его так, чтобы nl
на следующем проходе нашел свой разделитель раздела там, где он должен быть. sed
также сохраняет копию последней ^% [0-9.] * $
строки в своем старом пространстве h
- и если удерживаемое пространство не является пустым, когда он встречает строку, начинающуюся с номера, он добавляет эту строку к содержимому своего удерживаемого пространства после .
. И это действительно мясо с картошкой.
И все же - как я уже сказал, это еще не сделано. На последнем проходе в выводе остались разделители разделов и пустые строки. Итак, чтобы очистить это:
sd <<\IN |sd sub | sd subsub | sd subsubsub | grep -v '^\\:\|^$'
\begin{document}
\section{}
some ordinary lines
\subsection{}
whatever
\subsubsection{}
\subsection{}
\subsubsection{}
\subsubsubsection{}
\subsubsection{}
\subsubsubsection{}
\section{}
\subsection{}
\end{document}
IN
\begin{document}
%1
\section{}
some ordinary lines
%1.1
\subsection{}
whatever
%1.1.1
\subsubsection{}
%1.2
\subsection{}
%1.2.1
\subsubsection{}
%1.2.1.1
\subsubsubsection{}
%1.2.2
\subsubsection{}
%1.2.2.1
\subsubsubsection{}
%2
\section{}
%2.1
\subsection{}
\end{document}