Прокомментируйте (автоматически) ЛАТЕКСНЫЙ исходный файл для создания этого более читаемым

Удостоверьтесь свои работы команды из командной строки сначала

/usr/bin/python /home/MyName/WeatherProject/HOURLY/windDirExtract.py

Затем попробуйте то же в crontab

*/10 * * * * /usr/bin/python /home/MyName/WeatherProject/HOURLY/windDirExtract.py
3
26.03.2014, 19:39
3 ответа
[112408]У меня есть быстрое решение, которое полезно много раз. Обратите внимание, что оно предназначено только для личного пользования(1); его можно доработать, добавить редактирование на месте, контроль ошибок, что угодно. Но я думаю, что оно тоже полезно. Идея заключается в использовании самой нумерации LaTeX.

Итак, во-первых, вам нужно добавить метки к вашему документу (что, тем не менее, хорошо):

Далее запустите латекс, как всегда, допустим, он называется [112709]walla.tex[112710]. Теперь вы запускаете этот маленький питоновый скрипт:

Вызовите его [112711]find_tex_labels[112712], сделайте его исполняемым, и запустите его как [112713]find_tex_labels walla > walla_annotated.tex[112714] (обратите внимание, в аргументах нет расширений).

  • На выходе у вас будет аннотированный LaTeX-файл:

    • ...это сработает для всех меток. Я нахожу это довольно полезным для перекрестных ссылочных уравнений и т.д., когда я редактирую на устройстве, в котором нет LaTeX. Теперь вы можете заменить оригинальный walla.tex на новый.
    • Это ваша обязанность - синхронизировать все вещи... и нигде не использовать комментарии "%%% label".
    • Сноски:
  • (1) Я обещаю доработать его много раз. Затем, учитывая, что я единственный, кто его использует, я исправляю ошибки, если и когда они появляются... и никогда не нахожу времени, чтобы их почистить. [112428]

2
27.01.2020, 21:20

Относительно сложная часть состоит в том, что вам нужно буферизовать закомментированную строку, чтобы увидеть, его нужно обновить, если следующая строка является индикатором раздела. Было бы проще, если бы эти данные находились в той же или следующей строке.

Следующее должно вам помочь. Его можно вызвать как 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)
1
27.01.2020, 21:20

Как мне кажется, вы ищете параметр 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}
1
27.01.2020, 21:20

Теги

Похожие вопросы