Online video hd

Смотреть русский видео

Официальный сайт openw 24/7/365

Смотреть видео бесплатно

h0rr0rr_drag0n 04.08.2009 20:33

Скрипты на bash — Скрипт для преобразования Сишных исходников в красиво оформленный PDF файл.

Возникла у меня потребность перевести много исходников, написанных на C, в PDF файл, чтобы все это потом можно было распечатать на принтере. Хотелось иметь возможность выбора размера шрифта, нумерацию строк и подсветку ключевых слов.



Задумка была осуществлена при помощи LaTeX’а и скрипта на bash’е. Скрипт принимает один обязательный параметр – размер шрифта; список параметров можно узнать запустив скрипт без параметров.



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



Основная сложность была в формировании красивых листингов в латехе. Для этого я использовал пакет listings, который, как известно, весьма плохо работает с русскими комментариями в юникоде – он попросту сливает русские слова между собой: /* этокомментарийдемонстрирующийнаглядновышеозвученнуюпроблему */. В документации по пакету (стр. 55) было приведено решение этой проблемы, но возникла другая – теперь комментарии обрабатываются непосредственно LaTeX’ом и соответственно в них не должно символов наподобие “creat_pckt()” или “”. Эту новую проблему я, к сожалению, решил лишь частично – заменил во всем тексте программы символ “_” на “–”. Остальные запрещенные символы приходится править руками. Если придумать, как заменить эти запрещенные символы на “съедобные” латехом, причем только в комментариях (наподобие /* */, комментарии могут быть как однострочными так и многострочными), то проблема будет полностью решена.



Но, в принципе, и без этого скрипт работает для меня более менее удовлетворительно. Привожу его код:

  1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
#!/bin/bash



# Данный скрипт преобразует исходники из текущего каталога (*.c, *.h, Makefile)

# в оформленный PDF файл, посредством LaTeX.



# временный TeX файл

TEMP=`pwd | xargs basename`

TEMPTEX="$TEMP.tex"



# вывод справки

show_help() {

echo -e "Usage: $0 <-t|-s|-f|-S|-n|-l|-L|-h|-H>\n\t-t\ttiny\n\t-s\tscriptsize\n\t-f\tfootnotesize\n\t-S\tsmall\n\t-n\tnormalsize\n\t-l\tlarge\n\t-L\tLarge\n\t-h\thuge\n\t-H\tHuge\n"

exit 0

}



# получаем обязательный параметр - размер шрифта

if < "$#" -ne 1 >; then

show_help

fi

while getopts ":tsfSnlLhH" OPTN; do

case $OPTN in

t)

LETTER_SIZE='{\tiny '

;;

s)

LETTER_SIZE='{\scriptsize '

;;

f)

LETTER_SIZE='{\footnotesize '

;;

S)

LETTER_SIZE='{\small '

;;

n)

LETTER_SIZE='{\normalsize '

;;

l)

LETTER_SIZE='{\large '

;;

L)

LETTER_SIZE='{\Large '

;;

h)

LETTER_SIZE='{\huge '

;;

H)

LETTER_SIZE='{\Huge '

;;

"?")

echo "$OPTARG - unknown option!"

exit 1

;;

*)

echo "Unknown error while processing options!"

exit 1

;;

esac

done



echo "Creating temp LaTeX file: $TEMPTEX"



cat << EOFHDL >> $TEMPTEX

\documentclass<a4paper>{report}

\usepackage<bottom>{geometry}

\usepackage<t2a>{fontenc}

\usepackage{ucs}

\usepackage<utf8x>{inputenc}

\usepackage<english>{babel}

\usepackage{color}

\usepackage{listings}

\lstloadlanguages{<ansi>C,make}

\lstset{extendedchars=\true,

showstringspaces=false,

numbers=left,

tabsize=3,

frame=shadowbox,

breaklines=true,

breakatwhitespace=true,

rulesepcolor=\color{black},

inputencoding=utf8x,

escapebegin=\begin{cyr},

escapeend=\end{cyr}}

\pagestyle{plain}



\begin{document}

EOFHDL



echo $LETTER_SIZE >> $TEMPTEX



for file in *; do

echo "$file" | grep -q '.\{1,\}\.<ch>$'

if < $? -eq 0 >; then

echo -n "Processing $file: "

echo -n "is C source file."

# Заменяем возможные символы "_" на понимаемые TeXом "\_"

texffile=`echo "$file" | sed 's/_/\\\\_/g'`

# Мы должны заменить комментарии вида /* */ на /*` '*/, иначе

# TeX отобразит русские комментарии без пробелов между словами.

# FIXME: поскольку текст комментариев интерпретируется самим TeX'ом мы должны

# заменить в комментариях "_" на "\_". Я просто везде меняю "_" на "--".

# FIXME: точно так же TeX реагирует на любые escape и служебные символы в комментариях.

# Пока что, приходится менять руками /* "" */ на /* "\" */. =((

cat $file | sed 's/\/\*/\/\*'\`'/g' | sed 's/\*\//'''\*\//g' | sed 's/_/--/g' > /tmp/$TEMP-$file.c

echo "\lstinputlisting<escapeinside>{/tmp/$TEMP-$file.c}" >> $TEMPTEX

echo

fi

echo "$file" | grep -q 'Makefile'

if < $? -eq 0 >; then

echo -n "Processing $file: "

echo -n "is file for utility make."

# Тут обычно вообще не бывает комментариев - ничего не меняем.

echo "\lstinputlisting</escapeinside><escapeinside>{$file}" >> $TEMPTEX

echo

fi

done



cat << EOFEND >> $TEMPTEX

}

\end{document}

EOFEND



echo "Starting pdflatex. Please wait"

pdflatex $TEMPTEX &&gt; /dev/null

echo "PDF file: $TEMP.pdf created."

rm -vi $TEMP.aux $TEMP.log $TEMPTEX /tmp/$TEMP-*.c

</escapeinside></ch></ansi></english></utf8x></t2a></bottom></a4paper>



Тэги: bash latex pdf
+ 9 -
Похожие Поделиться

lomereiter 04.08.2009 21:28 #
+ 0 -
А что, если забить на extendedchars=\true, вместо utf8x написать koi8-r и просто прогонять файлы через iconv в однобайтовую кодировку?
lomereiter 04.08.2009 21:45 #
+ 1 -
Короче, уже пофиксил: http://s-c.me/GA (только там у pdflatex /dev/null убран в целях отладки).

А вообще — полезная шняга, спасибо :)
h0rr0rr_drag0n 04.08.2009 23:11 #
+ 0 -
Так уже гораздо лучше! Немного подправил скрипт, чтобы он работал и с Makefile'ами, а также не перекодировал в KOI8R все файлы в текущем каталоге, а только нужные: http://pastebin.ca/1518237
homolibere 05.08.2009 10:46 #
+ 0 -
а можно скрин работы скрипта, а то красота ПДФа готового смутно представляется
h0rr0rr_drag0n 05.08.2009 16:37 #
+ 0 -
Залил сам пдф. Ссылка: http://www.2shared.com/file/7010609/ae7eec0f/termemu.html
anjolio 05.08.2009 11:02 #
+ 0 -
Хорошо бы ссылку на готовый пдф ещё, чтобы все прям соблазнились! :)
h0rr0rr_drag0n 05.08.2009 16:36 #
+ 0 -
Что-то я снова намудрил с комментом - см. ниже ссылку на файл.
h0rr0rr_drag0n 05.08.2009 16:36 #
+ 0 -
Вот: http://www.2shared.com/file/7010609/ae7eec0f/termemu.html .
Соблазняйтесь на здоровье!
anjolio 05.08.2009 16:54 #
+ 0 -
а сиськи в шапке ваши или мне стоит проверять рабочий комп на вирусы уже? :)
h0rr0rr_drag0n 05.08.2009 21:53 #
+ 0 -
Мои. Нет, в смысле не мои личные, но я их вставил туда =)).
anjolio 06.08.2009 01:22 #
+ 0 -
Уф, отпустило :)
А то файлхостинг больно стрёмный какой-то был..
lockie 26.05.2010 06:43 #
+ 0 -
Это не некробамп, это напоминашка себе на будущее.
\usepackage{fontenc}
\usepackage{inputenc}
\usepackage{listings}
\lstset{extendedchars=true,language=C,basicstyle=\footnotesize,
tabsize=2,showstringspaces=false,
inputencoding=cp1251,escapebegin=\begin{cyr},escapeend=\end{cyr}}

\begin{document}
\lstinputlisting{src/myfile.c} % myfile.c д/б в cp1251, есичо, iconv в помощь
\end{document}

Выжечь. На спине разработчиков listings калёным железом.
Милое ли дело - завтра защита, а я полночи потратил на оформление листингов >__<

Смотреть видео онлайн

Онлайн видео бесплатно


Смотреть русское с разговорами видео

Online video HD

Видео скачать на телефон

Русские фильмы бесплатно

Full HD video online

Смотреть видео онлайн

Смотреть HD видео бесплатно

School смотреть онлайн