LINUX.ORG.RU

LaTeX: документ с данными из внешнего файла


0

0

Здравствуйте.
Известно, что TeX является своего рода языком программирования, и мне хотелось бы воспользоваться этой возможности для написания некоторого документа, который будет брать данные из некоторого файла (там записаны числа, по два на строку), ну и записывать их в таблицу, может быть производить с ними какие-то простые арифметические действия и т.д.

Вроде, бы в нашем распоряжении есть такие пакеты как ifthen, calc, fp.
Но, однако совершенно не понятно откуда же для них брать входные данные? Записывать их в сам документ -- не слишком удобно. Разбивать их по одному числу в файл и использовать \input -- тем более.

В общем хотелось бы что-нибудь из следующего:

1) Какой-то более совершенный \input, чтобы указать строку и поле для файла
2) Просто какой-то пакет позволяющий работать со строками (типа функций из strings.h в C)
3) Пакет для обработки файлов на уровне awk/sed
4) Наконец, просто какую-нить команду типа \system, которая позволила бы включить в текст документа вывод командной строки. (типа пишешь \system{ls} -- и вот ты уже имеешь в документе содержание текущей директории)

Для реализации 4) мне конечно совершенно не проблемно сделать скрипт, который будет заменять в документе все \system{команда} на вывод этой команды, но всё же интересно знать, нет ли уже встроенных средств?

★★★★★

Кхм... Латеховский файл - это просто текст. Пиши программу на любом языке программирования, которая сформирует латеховскую таблицу.

Beria.

anonymous
()

> Для реализации 4) мне конечно совершенно не проблемно сделать скрипт, который 
> будет заменять в документе все \system{команда} на вывод этой команды, но всё 
> же интересно знать, нет ли уже встроенных средств?

Как ни парадоксально, но проще всего показалось написать такой "скрипт"
с помощью lex'а:

$ cat mathlatex.l
%{
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
        int line;
        int syslev;
        int shfd, outfd;
%}

%Start CODE SYSTEM

%%

<INITIAL>.      { BEGIN CODE; unput(yytext[0]); }

<CODE>"\\system{" {
        syslev=0;
        fflush(stdout);
        shfd = open("/tmp/mathlex.sh", O_WRONLY|O_CREAT|O_TRUNC, S_IRWXU);
        outfd = dup(1);
        dup2(shfd, 1);
        close(shfd);
        printf("#!/bin/bash\n");
        BEGIN SYSTEM;
}
<SYSTEM>"{"     { syslev++; }
<SYSTEM>"}"     {
        if (syslev) syslev--; else
        {
                fflush(stdout);
                dup2(outfd, 1);
                system("/tmp/mathlex.sh");
                BEGIN CODE;
        }
}

\n              { line++; printf ("\n"); }

Компиляция:
$ lex -omathlatex.c mathlatex.l && gcc mathlatex.c -ll -o mathlatex

Демонстрация:
$ echo -e "ABC\n\system{ls}CDE" | ./mathlatex 
ABC
mathlatex  mathlatex.c  mathlatex.l
CDE

К Beria:
Не соглашусь с вами. TeX всё же создавался Дональдом Кнутом, и как истинный
программист, для себя он написал язык разметки, напоминающий язык
программирования. Это далеко не_просто текст.

Кстати, согласно истории: http://en.wikipedia.org/wiki/Tex
Начиная с TeX82 он включает в себя полную машину Тьюринга.

unDEFER ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.