Вычисления в латехе? Да запросто!

    Те, кому приходится верстать тексты посложнее служебок, знают, что латех — удобная надстройка над техом — на данный момент является чуть ли не единственным средством, позволяющим быстро верстать качественные тексты любой сложности. Но не текстом единым… Латех можно использовать и для других целей, о которых создатель Теха, Дональд Кнут, наверное и не думал.
    Я уже писал, как можно верстать в латехе презентации. Теперь же я хочу рассказать о том, как можно проводить несложные вычисления непосредственно силами латеха.

    Для латеха разными людьми написана уйма всевозможных пакетов, расширяющих его функционал и облегчающих работу верстальщику. Не забыты и средства, помогающие работать с численными данными. Несложные вычисления с использованием чисел с плавающей запятой (одинарной точности) можно выполнять непосредственно силами теха. Для этого и предназначен пакет fp. Сразу хочу заметить, что благодаря возможностям латеха выполнять внешние команды, можно даже выполнять более сложные действия на этапе компиляции (например, что-нибудь вычислять в Octave, затем строить в MathGL графики и вставлять их в текст), но об этом я, возможно, расскажу в другой раз.
    Я не задаюсь целью скопипастить мануал по пакету fp (тем более, что он достаточно небольшой), а хочу рассказать, как я использую этот пакет для простых вычислений при составлении всякого рода технических заданий, отчетов и т.п. А еще покажу, как с его помощью реализовать элементарный функционал «электронных таблиц».
    Для начала создадим команду, позволяющую вставлять различную варьирующуюся информацию (т.е. какие-то параметры, которые в дальнейшем вы можете и изменить), помечая в режиме черновой печати эти вставки красным надстрочным индексом и заметкой на полях. Цвет в документе нам обеспечит пакет colorx.
    Эта команда будет работать в трех вариантах:
    • без параметров (т.е. если нам нужно отметить место в тексте, где не хватает чего-то, что надо будет вставить в дальнейшем), в этом случае мы просто отметим пустое место в тексте красным квадратом с надстрочным индексом и вынесем на поля метку со знаком вопроса;
    • с одним параметром (т.е. мы вставили какие-то данные, которые в дальнейшем использоваться не будут), в этом случае вставленный текст отображается с надстрочным индексом и соответствующей пустой меткой на полях;
    • с двумя параметрами (т.е. наши данные будут использоваться дальше и мы хотим проинициализировать ими какую-то переменную), здесь также отображается инициализирующий текст с индексом, но на полях напротив этого индекса помещается имя переменной, в которую данное число заносится, плюс происходит инициализация этой переменной.
    Итак, вот сам код:

    \newcounter{InsC@unt@r} 
    \def\Ind@x{\stepcounter{InsC@unt@r}% 
    			\hbox to 0pt{\raisebox{1ex}{\tiny\red{\arabic{InsC@unt@r}}}}} 
    \def\Insm@rgimp@r#1{\marginpar{\red{\tiny\arabic{InsC@unt@r}:#1}}} 
    \ifx\TextOut\undefined 
    	\def\InsTxt@#1#2{#1\Ind@x\Insm@rgimp@r{#2}} 
    \else 
    	\def\InsTxt@#1#2{#1} 
    \fi 
    \def\Ins{\futurelet\next\Ins@i} 
    \def\Ins@i{\ifx\next\bgroup\expandafter\Ins@ii\else\expandafter\Ins@end\fi} 
    \def\Ins@ii#1{\def\temp@rg{#1}\futurelet\next\Ins@iii} 
    \def\Ins@iii{\ifx\next\bgroup\expandafter\Ins@two@rgs% 
    	\else\expandafter\Ins@one@rg\fi} 
    \def\Ins@two@rgs#1{\InsWFP{\temp@rg}{#1}} % Два аргумента 
    \def\InsWFP#1#2{\expandafter\FPset\csname #1\endcsname{#2}\InsTxt@{#2}{#1}} 
    \def\Ins@one@rg{\InsTxt@{\temp@rg}{}} % Один аргумент
    \def\Ins@end{\red{\Square\Ind@x}\Insm@rgimp@r{?}\xspace} % Нет аргументов 
    


    Поясню его. Сначала мы объявляем новый счетчик, который будет нами использоваться для нумерации индексов вставок. Далее определяются различные вспомогательные команды для основной команды \Ins, которой мы и будем вставлять свои данные в текст.
    Команды \Ind@x и \Insm@rgimp@r нужны для того, чтобы отмечать наши вставки в черновом режиме. Первая команда инкрементирует счетчик вставок, создает не занимающий по ширине места бокс и помещает в него красный надстрочный индекс с номером вставки. Вторая команда помещает отметку на поля. Сам черновой режим регулируется командой \TextOut: если мы определим ее (\def\TextOut{}) до этого куска кода, отметки на командой \def\InsTxt ставится не будут («беловой» режим верстки), иначе они будут проставляться.
    Дальше мы определяем собственно нашу команду \Ins, принимающую переменное количество аргументов. Она выполняет только одно: считывает следующий за ней токен (\futurelet) в макрос \next, отбрасывает его обратно и выполняет команду \Ins@i. Та, в свою очередь, проверяет, что же за токен следовал за нашей \Ins: если это открывающаяся фигурная скобка (\bgroup), то выполняется команда \Ins@ii с предварительным считыванием следующего за ней параметра (иначе эта команда свой параметр «не увидит»). Если же токеном является не скобка, значит, команда \Ins не имела аргументов и вызывается \Ins@end, помещающая пустой квадратик в текст и заметку на полях.
    Команда \Ins@ii помещает первый аргумент команды \Ins во макрос \temp@rg и опять выполняет проверку наличия следующего аргумента (\Ins@iii): если он есть, выполняется команда \Ins@two@rgs, инициализирующая переменную и вставляющую ее значение и метки в текст; если же его нет, выполняется команда \Ins@one@rg, которая просто вставляет в текст данные и делает отметку.
    Чтобы облегчить вывод результатов вычислений, создадим команду \FPrint, похожую по написанию на \FPprint из пакета fp, но делающую несколько другое: ее аргумент имеет вид выражение:число, где выражение — вычисления или команда, а число — количество цифр после запятой, до которых нужно округлить результат. На экран выводится округленное число. Здесь все достаточно просто реализовано, поэтому излишне комментировать не буду.

    \def\FPrint#1{\@@print@@#1} 
    \def\@@print@@#1:#2{\FPeval{\res@lt}{round(#1:#2)}\res@lt} 
    


    Для хранения каких-то общих для всего текста данных (скажем, величины, которая вычисляется на протяжении нескольких разделов документа, причем в каждом разделе вычисляется какая-то ее часть, а сумму нам нужно будет вывести в конце текста) определим команды \Ini (инициализирует пользовательскую переменную, имеет один обязательный аргумент — имя переменной, а также один необязательный — значение, которым переменная инициализируется), \Add (добавляет к переменной из первого параметра выражение из второго), \Sub (вычитает из переменной число) и \Show (отображает переменную в тексте, округляя ее до двух цифр после запятой или до количества цифр, указанных в необязательном параметре).

    \newcommand{\Ini}[2][0]{\expandafter\gdef\csname cntr#2\endcsname{#1}} 
    \def\Add#1#2{\expandafter\FPeval\csname cntr#1\endcsname{cntr#1+(#2)}} 
    \def\Sub#1#2{\expandafter\FPeval\csname cntr#1\endcsname{cntr#1-(#2)}} 
    \newcommand{\Show}[2][2]{\FPrint{cntr#2:#1}} 
    


    Благодаря тому, что к имени переменной, определяемой пользователем, добавляется префикс cntr, почти исчезает вероятность случайного переопределения каких-либо латеховских макросов.
    Далее перейдем к «электронным таблицам». Для начала заведем автоматическую нумерацию:

    \newcount\@row@num\@row@num=15 
    \def\@@nonum{} 
    \def\@shownum{\ifx\@@nonum\empty\global\advance\@row@num1 \the\@row@num\else 
    	\gdef\@@nonum{}\fi} 
    \def\NumIni{\global\@row@num=0\gdef\@@nonum{1}} 
    \def\NoNum{\gdef\@@nonum{1}} 
    \newcolumntype{N}[1]{>{\strut}#1<{\@shownum}} 
    


    Инициализацию счетчика надо выполнять вручную, ставя в начале таблицы команду \NumIni (либо придумать нечто наподобие \everypage, но для таблиц). При помощи пакета array мы будем выполнять определенные нами команды для каждой ячейки нужного столбца. Этот же пакет позволяет определить новые типы столбцов: тот столбец таблицы, в который мы хотим вставить автонумерацию, надо будет пометить типом N. Если в какую-то ячейку нам не нужно вставлять номер, будем помечать ее макросом \NoNum.
    Теперь перейдем к определению типов столбцов, позволяющих выполнять сложение, вычитание, умножение и деление с числовыми переменными. Так как код всех этих команд почти не отличается друг от друга (кроме выполняемой в \FPeval арифметической операции), для начала определим макрос, облегчающий определение новых команд.
    Заранее предупрежу: т.к. для однозначного определения окончания числа, находящегося в ячейке таблицы, пришлось бы сканировать его посимвольно (что сильно увеличило бы время компиляции текста), я пошел другим путем. В конце каждой ячейки перед знаком амперсанда необходимо вставлять пробел, однозначно символизирующий окончание данных внутри ячейки. Если забыть этот пробел, могут появиться «странные ошибки».
    Подробно пояснять следующий макрос я не буду, ограничусь лишь поверхностным описанием. Команда \@@def@cmd позволяет определить новый макрос (чье имя указано в первом параметре), выполняющий арифметическое действие из второго параметра, а также создать новый тип столбца таблицы (третий параметр). Так как эта команда используется для инициализации других команд, да еще и определяет новую команду по имени из параметра, используются такие теховские конструкции, как \expandafter (подавление раскрытия следующего токена, пока не раскроется следующий через один токен), \xdef (она идентична \global\edef и определяет новый макрос, предварительно раскрывая макросы из своего тела), \noexpand (запрет раскрытия токена «в первом прочтении»), \csname (преобразование текста в имя макроса).

    \def\@@def@cmd#1#2#3{% 
    	\expandafter\xdef\csname #1\endcsname##1\ignorespaces{% 
    		\xdef\noexpand\@fst@rg{##1}\futurelet\noexpand\next\expandafter\noexpand\csname 
    			@@#1@\endcsname} 
    	\expandafter\xdef\csname @@#1@\endcsname{% 
    		\noexpand\ifx\noexpand\next\unskip\relax 
    		\noexpand\else\noexpand\expandafter\expandafter\noexpand\csname 
    		@testminus@#1\endcsname\noexpand\fi} 
    	\expandafter\xdef\csname @testminus@#1\endcsname{% 
    		\noexpand\ifx\noexpand\next-\noexpand\expandafter\expandafter\noexpand 
    			\csname @@m@#1\endcsname\noexpand\else 
    			\noexpand\expandafter\expandafter\noexpand 
    			\csname @@@#1\endcsname\noexpand\fi} 
    	\expandafter\xdef\csname @@@#1\endcsname##1 {% 
    		\noexpand\ifnum1=1##1{}\noexpand\else##1 \noexpand#2{##1}\noexpand\fi} 
    	\expandafter\xdef\csname @@m@#1\endcsname##1 {##1 \noexpand#2{##1}} 
    	\newcolumntype{#3}[2]{>{\csname #1\endcsname{##1}}##2} 
    } 
    


    Теперь, когда мы проделали грязную работу, можно определить основные команды:

    \def\@SET#1{\expandafter\xdef\csname cntr\@fst@rg\endcsname{#1}} 
    \def\@ADD#1{\FPeval{\res@lt}{cntr\@fst@rg+(#1)}\@SET{\res@lt}} 
    \def\@SUB#1{\FPeval{\res@lt}{cntr\@fst@rg-(#1)}\@SET{\res@lt}} 
    \def\@MUL#1{\FPeval{\res@lt}{cntr\@fst@rg*(#1)}\@SET{\res@lt}} 
    \def\@DIV#1{\FPeval{\res@lt}{cntr\@fst@rg/(#1)}\@SET{\res@lt}} 
    \@@def@cmd{TAdd}{\@ADD}{+} 
    \@@def@cmd{TSub}{\@SUB}{-} 
    \@@def@cmd{TMul}{\@MUL}{*} 
    \@@def@cmd{TDiv}{\@DIV}{/} 
    \@@def@cmd{TSet}{\@SET}{X} 
    


    Теперь у нас есть следующие новые типы столбцов, принимающие два аргумента (имя переменной и стандартный тип выравнивания ячейки). Типы +, -, * и / выполняют соответствующие операции между переменной из первого аргумента типа ячейки и содержащимся в ячейке числом. Тип X устанавливает переменную в значение, содержащееся в ячейке. Если переменная должна будет использоваться, не инициализируясь столбцом X, ее надо до таблицы инициализировать командой \Ini. Содержимое ячейки проверяется: если там не число, то действия не выполняются.
    Теперь нам остается объявить еще один тип столбца, который позволит отображать результаты вычисления (а также при необходимости считать их сумму).

    \def\@@plus#1#2{\gdef\@fst@rg{#1}\@ADD{cntr#2}} 
    \def\@Sho@@#1{\ifx\@@nonum\empty\@@plus{#1}{\temp@rg}\else\gdef\@@nonum{}\fi} 
    \def\@Sh@{\ifx\next\bgroup\expandafter\@Sho@@\else\gdef\@@nonum{}\fi} 
    \def\Sho#1{\ifx\@@nonum\empty\Show{#1}\fi\def\temp@rg{#1}\futurelet\next\@Sh@} 
    \newcolumntype{S}[3]{>{\strut}#3<{\Sho{#1}{#2}}} 
    


    Мы создаем новый тип столбца — S, имеющий три параметра: имя отображаемой переменной, имя переменной-аккумулятора и тип выравнивания. На эту команду тоже действует \NoNum. Команда \Sho, реализующая тип S, может выполняться и сама по себе. В этом случае если нам не нужно накапливать результаты в какой-то переменной, мы просто даем этой команде только один аргумент.
    Ну и напоследок — немного развлечений. Подключим пакет ifthen для реализации сложных условных инструкций (тех не позволяет вложенных if) и сделаем реализацию циклов и стека.
    Простейший цикл for (без вложенных) можно определить так:

    \newcounter{f@rc@unter} 
    \newcommand{\forplus}[4][1]{% 
    	\setcounter{f@rc@unter}{#2}\ifthenelse{\value{f@rc@unter} < #3}{#4% 
    		\addtocounter{f@rc@unter}{#1}% 
    		\forplus[#1]{\value{f@rc@unter}}{#3}{#4}}{}} 
    \newcommand{\forminus}[4][-1]{% 
    	\setcounter{f@rc@unter}{#2}\ifthenelse{\value{f@rc@unter} > #3}{#4% 
    		\addtocounter{f@rc@unter}{#1}% 
    		\forminus[#1]{\value{f@rc@unter}}{#3}{#4}}{}} 
    \def\iterator{\arabic{f@rc@unter}} 
    \def\Loop#1#2{\forplus{0}{#1}{#2}} 
    


    Здесь реализовано четыре команды. \forplus позволяет выполнять цикл с инкрементом от числа, указанного в первом параметре, до числа во втором, выполняя каждый раз содержимое третьего параметра. Необязательный аргумент макроса — шаг цикла. Команда \forminus реализует цикл с декрементом. \iterator позволяет вывести содержимое итератора цикла, а \Loop — выполнить содержимое второго аргумента N раз (где N — первый аргумент).
    Для работы со стеком определим команды \push и \pop, а также \stacklen (количество элементов в стеке), \popall (вывод всего содержимого стека) и \popalldel (вывод содержимого с разделителем).

    \newcount\@buflen\@buflen=0 
    \newtoks\@@stack 
    \@@stack={\empty} 
    \def\push#1{\advance\@buflen1\begingroup\toks0={{#1}}% 
       \edef\act{\endgroup\global\@@stack={\the\toks0 \the\@@stack}}\act} 
    \def\pop{\ifnum\@buflen>0\advance\@buflen-1\fi\begingroup% 
       \edef\act{\endgroup\noexpand\splitList\the\@@stack(tail)\@@stack}\act} 
    \def\splitList#1#2(tail)#3{\ifx#1\empty\red{Стек пуст!}\else{#1}\global#3={#2}\fi} 
    \def\stacklen{\the\@buflen\xspace} 
    \def\popalldel#1{\ifthenelse{\the\@buflen > 1}{\pop#1\popalldel{#1}}% 
    	{\ifnum\@buflen=1\pop\fi}} 
    \def\popall{\popalldel{}} 
    


    Стек реализован через простой список токенов. Помещение в стек просто добавляет к началу списка новый токен, а выбор из стека разбивает список по первому токену и возвращает его.


    Примеры

    Пример работы с таблицами:

    \Ini[1]{yy} 
    \Ini{zz} 
    \begin{table}[!th] 
    \begin{tabular}{|N{c}|X{xx}{c}|*{xx}{c}|S{xx}{zz}{c}|*{yy}{c}|} 
    \hline 
    \bf \NumIni \No{} п/п & A & B & A$\cdot$B\NoNum& C \\ 
    \hline 
    & -3.5 & 4.4 &&43.3 \\ 
    & 31.31 &200.21 &&3 \\ 
    & 1.23 &3.33 &&1.2 \\ 
    \hline 
    \NoNum&&&\NoNum $\sum(A\cdot B)=\,$\Show{zz}&$\prod C=\,$\Show{yy} \\ 
    \hline 
    \end{tabular} 
    \end{table} 
    




    Пример работы с инициализируемыми переменными и вычислениями:

    \Ini{totalmass} 
    Пусть в переменной {\tt totalmass} у нас хранится суммарная масса чего-то, массы частей чего мы 
    будем вычислять на протяжении всего текста. Все эти элементы будем по мере вычисления к ней 
    добавлять. 
    
    Итак, здесь мы вычислим что-то, равное \Ins{m1p}{45.1},\FPeval{m1}{3*m1p} 
    а потом умножим его на три: $m_1=3\cdot\FPrint{m1p:1}=\FPrint{m1:1}$. Добавим это к общей 
    массе.\Add{totalmass}{m1} Получим: {\tt totalmass}$\,=\Show[1]{totalmass}$. 
    
    Далее, когда нам понадобится определить новую переменную, равную, скажем, 
    \Ins{moreaddtoa}{3.45}, и добавить ее к массе, опять воспользуемся тем же приемом. 
    Получим: {\tt totalmass}$\,\Add{totalmass}{moreaddtoa}=\Show[2]{totalmass}$. 
    
    Через некоторое время вычислим еще что-нибудь. Пусть плотность чего-то равна 
    $\rho=\,$\Ins{therho}{5.43}, а объем равен $V=\,$\Ins{theV}{12.44}, тогда его масса 
    \FPeval{mi}{therho*theV}$m_i=\rho\cdot V=\FPrint{mi:3}$. Добавим и его к общей 
    массе.\Add{totalmass}{mi} В итоге получим: {\tt totalmass}$\,=\Show[3]{totalmass}$. 
    
    Команды \verb'\Ini', \verb'\Show' и \verb'\FPrint' можно использовать внутри групп. 
    Команду \verb'\Ins' и команды вычислений пакета {\tt fp} использовать внутри формул нельзя: 
    первую из-за работы с полями, остальные "--- из-за того, что в них не используется команда 
    \verb'\global' и вычисления, выполненные внутри группы, вне группы действия не возымеют. 
    




    Пример работы с циклами и стеком:

    Пусть катеты треугольника равны a=\Ins{a}{2.5}, b=\Ins{b}{3}, тогда 
    гипотенуза будет равна $c=\sqrt{a^2+b^2}=\FPrint{root(2, (a^2 + b^2)):2}$ 
    
    Цикл от 1 до 4: \forplus{1}{5}{\iterator~} 
    
    Цикл от 1 до 10 с шагом 3: \forplus[3]{1}{11}{\iterator~} 
    
    Цикл от 4 до 1: \forminus{4}{0}{\iterator~} 
    
    Цикл от 10 до 1 с шагом -3: \forminus[-3]{10}{0}{\iterator~} 
    
    \Loop5{Пять раз! } 
    
    \push{первый}\push{второй}\push{третий}\push{последний} 
    Содержимое стека через запятую: \popalldel{, }. Осталось: \stacklen записей. 
    




    Текст примера
    Получившийся pdf

    Similar posts

    Ads
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More

    Comments 103

    • UFO just landed and posted this here
        +1
        В том-то и дело, что если вам нужно что-то считать на протяжении всего текста, при использовании питона, октавы и т.п. придется создавать уйму временных файлов, в которых будут храниться промежуточные результаты. А так все довольно просто.
        Если оформить весь код до примеров в отдельный стилевой файл (можно и опцию draft сделать, чтобы не определять вручную команду), то вообще лаконично получится.
        • UFO just landed and posted this here
        0
        Ненормальное программирование %)
        Также использую python+latex.
          +3
          Вот интересно: почему на техническом ресурсе так мало людей, использующих латех?
          • UFO just landed and posted this here
              0
              И книжки вы тоже будете при помоди doxygen'а писать?
              • UFO just landed and posted this here
              • UFO just landed and posted this here
                • UFO just landed and posted this here
                    +3
                    XML must die, ибо не читаем человеком, занимает уйму места. И вообще, дрянь!
                    • UFO just landed and posted this here
                        +1
                        > Про «занимает уйму места» — смешно.

                        ОК. Сравните формулу в латехе и такую же формулу в mathML. А потом подумайте, почему последний не нашел широкого применения.
                        • UFO just landed and posted this here
                            +2
                            Ну и нафига мне тогда нужен ваш docbook, если я просто сверстаю все в латехе?
                            • UFO just landed and posted this here
                                +1
                                Латех и только латех обеспечит хорошую структуру документа.
                                • UFO just landed and posted this here
                                    0
                                    Пока только от вас.
                                    • UFO just landed and posted this here
                                        0
                                        Я в латехе тоже: если файл небольшой, просто ctrl+x → ctrl+v, если большой, то то же самое, но с \include
                                        • UFO just landed and posted this here
                                          • UFO just landed and posted this here
                                              –1
                                              Воспользуюсь sed'ом.
                                              • UFO just landed and posted this here
                                                  0
                                                  Выделю кусок от начала до конца раздела (поиск → регулярка "\subse|\sec") и внутри выделения 's/sub//g' для повышения уровня или 's/sec/subsec/g' для повышения.
                                                  • UFO just landed and posted this here
                                                      0
                                                      > \subsequence
                                                      я таким не пользуюсь. Если что — можно и так: 's/subsection/section/g' — чтобы наверняка.

                                                      > \mySuperNiceSection
                                                      Если уж кто делает такие макросы, сам пусть придумывает, как с ними работать ☺
                                                      • UFO just landed and posted this here
                                                          +1
                                                          Поясняю: вот у меня, к примеру, диссертация. Каждая глава — в отдельной директории, каждый раздел — в отдельном файле.
                                                          Я их потихоньку редактирую, собираю по частям (includeonly) и все у меня просто и понятно.
                                                          Если бы мне пришлось диссер верстать в XML, я бы лучше пошел, да повесился!
                                                          • UFO just landed and posted this here
                                                            • UFO just landed and posted this here
                                                                –1
                                                                Батенька, отсыпьте, вам же слишком много на одного!
                                                                • UFO just landed and posted this here
                                                      • UFO just landed and posted this here
                                +3
                                Только наркоман может сказать, что вот это:
                                <?xml version="1.0" encoding="UTF-8"?>
                                <math xmlns="http://www.w3.org/1998/Math/MathML">
                                <mrow>
                                  <mi>x</mi>
                                  <mo>=</mo>
                                  <mfrac>
                                    <mrow>
                                      <mrow>
                                        <mo>-</mo>
                                        <mi>b</mi>
                                        <mo>±</mo>
                                      </mrow>
                                      <msqrt>
                                        <mrow>
                                          <msup>
                                            <mi>b</mi>
                                            <mn>2</mn>
                                          </msup>
                                          <mo>-</mo>
                                          <mrow>
                                            <mn>4</mn>
                                            <mi>a</mi>
                                            <mi>c</mi>
                                          </mrow>
                                        </mrow>
                                      </msqrt>
                                    </mrow>
                                    <mrow>
                                      <mn>2</mn>
                                      <mi>a</mi>
                                    </mrow>
                                  </mfrac>
                                 </mrow>
                                </math>
                                

                                удобнее, чем это:
                                x = \frac{-b \pm \sqrt{b^2 - 4ac}}{2a}
                                
                                • UFO just landed and posted this here
                                    0
                                    И сколько вы времени убьете, чтобы эту формулу так написать?
                                    А у меня на эту формулу с десяток-другой секунд от силы уйдет!
                                    • UFO just landed and posted this here
                                        –1
                                        Спасибо, у меня geany есть.
                                    • UFO just landed and posted this here
                                      • UFO just landed and posted this here
                                        • UFO just landed and posted this here
                                          • UFO just landed and posted this here
                                            • UFO just landed and posted this here
                                              • UFO just landed and posted this here
                                                • UFO just landed and posted this here
                                                  • UFO just landed and posted this here
                                                    • UFO just landed and posted this here
                                                      • UFO just landed and posted this here
                                                        • UFO just landed and posted this here
                                                          • UFO just landed and posted this here
                                                      0
                                                      Если мне нужно быстро сделать формулу для какой-нибудь html-ной статейки, то я делаю так:
                                                      formulator '$f_{n}=\frac{1}{\sqrt{5}}\left[\left(\frac{1+\sqrt{5}}{2}\right)^n - \left(\frac{1-\sqrt{5}}{2}\right)^n\right]$' preview.png
                                                      

                                                      и получаю:

                                                      Быстро и просто.
                                                      • UFO just landed and posted this here
                                • UFO just landed and posted this here
                                  • UFO just landed and posted this here
                                      +1
                                      > Если вам нужно не просто написать книжку, а например, интегрировать ее содержание с каким-нибудь программным обеспечением, посчитать статистику по ней и т.п.

                                      Все это делается средствами латеха или обычными sed+grep+awk!

                                      > Если он становится большим — важна.

                                      Тогда используются инструкции \include и \includeonly в преамбуле.
                                      • UFO just landed and posted this here
                                          +1
                                          > Инструменты сисадмина, но не программиста.
                                          Чегооо?
                                          > Эти инструкции никак не повлияют на объем исходных текстов.
                                          Зато они будут в разных файлах и с ними будет удобно работать. А уж ваши XML'ы так вообще страх!
                                          • UFO just landed and posted this here
                                            0
                                            >>Все это делается средствами латеха или обычными sed+grep+awk!
                                            >Инструменты сисадмина, но не программиста.

                                            WUT? Программист не сумевший разобраться в grep/sed/awk хотя бы на базовом уровне — не программист, а непоймичо.
                                            • UFO just landed and posted this here
                                                0
                                                Я — не сисадмин и не программист. coreutils использую часто. ЧЯДНТ?
                                                • UFO just landed and posted this here
                                                    0
                                                    Был бы программистом — тем паче пользовался бы. Иначе никак.
                                                  0
                                                  Значит человек пишуший shell скрипты — только сисадмин? А как быть тогда со мной, когда при разработке под linux мне приходится использовать и C и bash и python и ещё много разного в зависимости от ситуации.

                                                  Нет жёсткого разделения на программист и админ. Все толковые администраторы умеют писать программы хотя бы на одном языке программирования, пусть даже и на шелле.
                                                  • UFO just landed and posted this here
                                                      0
                                                      git/svn в зависимости от того что уже используется. Если что-то новое — то git, если из legacy — svn.
                                                      • UFO just landed and posted this here
                                                          0
                                                          ORLY? вы серьёзно? значит вы мало знаете про sed/awk
                                                          • UFO just landed and posted this here
                                                              –1
                                                              Выполнима. Просто не нужно никому обычно такое вытворять.
                                                              А вообще, если вдруг захочется такие штуки делать, можно просто в латехе сделать команды для начала и конца «общего» раздела (а внутренний счетчик вложенности будет уже выбирать, что за раздел).
                                                              Т.е. код
                                                              \asection{название}текст
                                                              \asection{подназвание}текст
                                                              \endasection
                                                              \asection{еще}
                                                              \asection{еще}
                                                              \endasection\endasection\endasection
                                                              

                                                              Преобразуется в классе article в
                                                              \section{название}текст
                                                              \subsection{подназвание}текст
                                                              \subsection{еще}
                                                              \subsubsection{еще}
                                                              
                                                              • UFO just landed and posted this here
                                                                  –1
                                                                  Батенька, вы бредите!
                                                                  • UFO just landed and posted this here
                                                            –1
                                                            Вы бы man sed почитали для начала!
                                                            • UFO just landed and posted this here
                                                                0
                                                                У нас в латехе верстают «тетки», которые вообще далеки и от программирования, и от английского языка.
                                                                Ничего там сложного нет!
                                                                А вот верстать научные публикации в «ворде» или еще какой говноте — маразм высшей категории!
                                    • UFO just landed and posted this here
                                      • UFO just landed and posted this here
                                          +1
                                          Хотел бы я взглянуть хоть на одну серьезную книгу с огромной библиографией, многоуровневыми оглавлениями, предметным указателем и кучей формул, «верстанную» в XML.
                                          Подозреваю, что это невозможно. Либо исходник будет адски велик!
                                          • UFO just landed and posted this here
                                              +1
                                              Да не предназначен он для этого!
                                              • UFO just landed and posted this here
                                                  +1
                                                  Оттуда, что DocBook с XML работает!
                                                  • UFO just landed and posted this here
                                                  0
                                                  Насколько я знаю, O'Reilly используют DocBook для своих книг.
                                                    0
                                                    А не латех?
                                                      0
                                                      DocBook или Word, но LaTeX тоже принимают с согласия редактора: Tools
                                      0
                                      Два момента.
                                      1. Зачем в заголовок выносить какое-то нелепое «латех», я читаю новости через rss-фид, встретил интригующее название, полез читать, оказалось о latex'е.
                                      2. Я когда-то тоже организовывал подобное, всё очень красиво делается связкой xslt + xsl-fo.
                                        –1
                                        1. Потому что он латехом и называется.
                                        2. А как вы потом полученный XML в латех конвертировали?
                                          –5
                                          1. Вообще-то «латекс», если уж на то пошло. Но я не об этом, пишите latex, и сразу пропадёт неоднозначность, ибо продукт известный.
                                          2. Я пользовался fop'ом.
                                          • UFO just landed and posted this here
                                              +2
                                              Точнее, La-τεχ, то есть Lamport's τεχ.
                                              0
                                              Из латекса изготавливают «изделия №2», а верстают в латехе!
                                          +2
                                          По-моему, самая большая проблема латеха в том, что в нем представление не отделено от вычислений. Понятный и читабельный код на нем писать, кажется, сложно или невозможно вовсе.

                                          Ваш пост – отличный тому пример.
                                            0
                                            > Понятный и читабельный код на нем писать, кажется, сложно или невозможно вовсе.

                                            Макроопределения выносятся обычно в стилевой файл. В результате получается лаконичная и понятная конструкция.

                                            Посмотрите тот же пример с таблицей — все довольно прозрачно же!
                                              +1
                                              Даже если выносить вычисления в стилевой файл – его тоже кто-то должен написать.

                                              Я просто недавно пробовал написать свой стиль для библатеха (супер-модная система, все дела). Жуткое дело, скажу я вам.

                                              Пример с табличкой, конечно, выглядит читаемым. Но все равно проблема такая, как мне кажется, есть.
                                                0
                                                > Даже если выносить вычисления в стилевой файл – его тоже кто-то должен написать.

                                                Это не так уж и сложно. Главное — сначала хорошо почитать кнутовского «Все про ТеХ».

                                                > проблема такая, как мне кажется, есть.

                                                Вы попробуйте почитать исходники тех стилевых файлов, которыми постоянно пользуетесь. А еще — саму основу (latex.ltx), позволяющую из теха сделать латех. И ведь писал же кто-то это! И продолжают писать: CTAN все пополняется и пополняется.
                                                  +1
                                                  Ладно, не будем спорить. Я тоже использую латех в повседневной жизни. И не могу сказать, что ему есть удобная и рабочая замена.

                                                  В качестве эксперимента даже ворд им заменить пытаюсь. Не знаю, удастся ли :)
                                            0
                                            Есть ещё интересный проект luatex
                                              +2
                                              Увидел, как тут спорят о формулах.
                                              Решил выложить в интернет свой генератор MathML формул из текстовой строки.

                                              forum.wofh.ru/f/p1.php

                                              Может кому пригодится.
                                              Если найдете ошибки — пишите в личку.
                                                0
                                                А как с интегралами, частными производными, всякими дельтами и т.д., и т.п.?

                                                Only users with full accounts can post comments. Log in, please.