1 | #!/usr/bin/perl -w␊ |
2 | ␊ |
3 | # Copyright (c) 2004, 2005 by Nicolas FRANÇOIS <nicolas.francois@centraliens.net>␊ |
4 | #␊ |
5 | # This file is part of po4a.␊ |
6 | #␊ |
7 | # This program is free software; you can redistribute it and/or modify␊ |
8 | # it under the terms of the GNU General Public License as published by␊ |
9 | # the Free Software Foundation; either version 2 of the License, or␊ |
10 | # (at your option) any later version.␊ |
11 | #␊ |
12 | # This program is distributed in the hope that it will be useful,␊ |
13 | # but WITHOUT ANY WARRANTY; without even the implied warranty of␊ |
14 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the␊ |
15 | # GNU General Public License for more details.␊ |
16 | #␊ |
17 | # You should have received a copy of the GNU General Public License␊ |
18 | # along with po4a; if not, write to the Free Software␊ |
19 | # Foundation, Inc.,␊ |
20 | # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA␊ |
21 | #␊ |
22 | ########################################################################␊ |
23 | ␊ |
24 | =encoding UTF-8␊ |
25 | ␊ |
26 | =head1 NAME␊ |
27 | ␊ |
28 | Locale::Po4a::LaTeX - convert LaTeX documents and derivates from/to PO files␊ |
29 | ␊ |
30 | =head1 DESCRIPTION␊ |
31 | ␊ |
32 | The po4a (PO for anything) project goal is to ease translations (and more␊ |
33 | interestingly, the maintenance of translations) using gettext tools on␊ |
34 | areas where they were not expected like documentation.␊ |
35 | ␊ |
36 | Locale::Po4a::LaTeX is a module to help the translation of LaTeX documents into␊ |
37 | other [human] languages. It can also be used as a base to build modules for␊ |
38 | LaTeX-based documents.␊ |
39 | ␊ |
40 | This module contains the definitions of common LaTeX commands and␊ |
41 | environments.␊ |
42 | ␊ |
43 | See the L<Locale::Po4a::TeX(3pm)|Locale::Po4a::TeX> manpage for the list␊ |
44 | of recognized options.␊ |
45 | ␊ |
46 | =head1 SEE ALSO␊ |
47 | ␊ |
48 | L<Locale::Po4a::TeX(3pm)|Locale::Po4a::TeX>,␊ |
49 | L<Locale::Po4a::TransTractor(3pm)|Locale::Po4a::TransTractor>,␊ |
50 | L<po4a(7)|po4a.7>␊ |
51 | ␊ |
52 | =head1 AUTHORS␊ |
53 | ␊ |
54 | Nicolas François <nicolas.francois@centraliens.net>␊ |
55 | ␊ |
56 | =head1 COPYRIGHT AND LICENSE␊ |
57 | ␊ |
58 | Copyright 2004, 2005 by Nicolas FRANÇOIS <nicolas.francois@centraliens.net>.␊ |
59 | ␊ |
60 | This program is free software; you may redistribute it and/or modify it␊ |
61 | under the terms of GPL (see COPYING file).␊ |
62 | ␊ |
63 | =cut␊ |
64 | ␊ |
65 | package Locale::Po4a::LaTeX;␊ |
66 | ␊ |
67 | use 5.006;␊ |
68 | use strict;␊ |
69 | use warnings;␊ |
70 | ␊ |
71 | require Exporter;␊ |
72 | use vars qw($VERSION @ISA @EXPORT);␊ |
73 | $VERSION= $Locale::Po4a::TeX::VERSION;␊ |
74 | @ISA= qw(Locale::Po4a::TeX);␊ |
75 | @EXPORT= qw();␊ |
76 | ␊ |
77 | use Locale::Po4a::TeX;␊ |
78 | use subs qw(&generic_command␊ |
79 | &parse_definition_file␊ |
80 | ®ister_generic_command␊ |
81 | ®ister_generic_environment);␊ |
82 | *parse_definition_file = \&Locale::Po4a::TeX::parse_definition_file;␊ |
83 | *generic_command = \&Locale::Po4a::TeX::generic_command;␊ |
84 | *register_generic_command = \&Locale::Po4a::TeX::register_generic_command;␊ |
85 | *register_generic_environment = \&Locale::Po4a::TeX::register_generic_environment;␊ |
86 | use vars qw($RE_ESCAPE $ESCAPE␊ |
87 | $no_wrap_environments␊ |
88 | %commands %environments␊ |
89 | %separated_command %separated_environment␊ |
90 | %command_parameters %environment_parameters␊ |
91 | %env_separators␊ |
92 | @exclude_include);␊ |
93 | *RE_ESCAPE = \$Locale::Po4a::TeX::RE_ESCAPE;␊ |
94 | *ESCAPE = \$Locale::Po4a::TeX::ESCAPE;␊ |
95 | *no_wrap_environments = \$Locale::Po4a::TeX::no_wrap_environments;␊ |
96 | *commands = \%Locale::Po4a::TeX::commands;␊ |
97 | *environments = \%Locale::Po4a::TeX::environments;␊ |
98 | *separated_command = \%Locale::Po4a::TeX::separated_command;␊ |
99 | *separated_environment = \%Locale::Po4a::TeX::separated_environment;␊ |
100 | *env_separators = \%Locale::Po4a::TeX::env_separators;␊ |
101 | *exclude_include = \@Locale::Po4a::TeX::exclude_include;␊ |
102 | *command_parameters = \%Locale::Po4a::TeX::command_parameters;␊ |
103 | *environment_parameters = \%Locale::Po4a::TeX::environment_parameters;␊ |
104 | ␊ |
105 | ␊ |
106 | # documentclass:␊ |
107 | # Only read the documentclass in order to find some po4a directives.␊ |
108 | # FIXME: The documentclass could contain translatable strings.␊ |
109 | # Maybe it should be implemented as \include{}.␊ |
110 | register_generic_command("*documentclass,[]{}");␊ |
111 | # We use register_generic_command to define the number and types of␊ |
112 | # parameters. The function is then overwritten:␊ |
113 | $commands{'documentclass'} = sub {␊ |
114 | my $self = shift;␊ |
115 | my ($command,$variant,$args,$env) = (shift,shift,shift,shift);␊ |
116 | my $no_wrap = shift;␊ |
117 | ␊ |
118 | # Only try to parse the file. We don't want to fail or parse this file␊ |
119 | # if it is a standard documentclass.␊ |
120 | my $name = ($args->[0] eq '[')? $args->[3]: $args->[1];␊ |
121 | parse_definition_file($self, $name.".cls", 1);␊ |
122 | ␊ |
123 | my ($t,@e) = generic_command($self,$command,$variant,$args,$env,$no_wrap);␊ |
124 | ␊ |
125 | return ($t, @$env);␊ |
126 | };␊ |
127 | ␊ |
128 | # LaTeX 2␊ |
129 | # I chose not to translate files, counters, lengths␊ |
130 | register_generic_command("*addcontentsline,{}{}{_}");␊ |
131 | register_generic_command("address,{_}"); # lines are seperated by \\␊ |
132 | register_generic_command("*addtocontents,{}{_}");␊ |
133 | register_generic_command("*addtocounter,{}{}");␊ |
134 | register_generic_command("*addtolength,{}{}");␊ |
135 | register_generic_command("*addvspace,{}");␊ |
136 | register_generic_command("alph,{}"); # another language may not want this alphabet␊ |
137 | register_generic_command("arabic,{}"); # another language may not want an arabic numbering␊ |
138 | register_generic_command("*author,{_}"); # authors are separated by \and␊ |
139 | register_generic_command("bibitem,[]{}");␊ |
140 | register_generic_command("*bibliographystyle,{}"); # BibTeX␊ |
141 | register_generic_command("*bibliography,{}"); # BibTeX␊ |
142 | register_generic_command("*centerline,{_}");␊ |
143 | register_generic_command("*caption,[]{_}");␊ |
144 | register_generic_command("cc,{_}");␊ |
145 | register_generic_command("circle,[]{}");␊ |
146 | register_generic_command("cite,[_]{}");␊ |
147 | register_generic_command("cline,{}");␊ |
148 | register_generic_command("closing,{_}");␊ |
149 | register_generic_command("dashbox,{}"); # followed by a (w,h) argument␊ |
150 | register_generic_command("date,{_}");␊ |
151 | register_generic_command("*enlargethispage,{}");␊ |
152 | register_generic_command("ensuremath,{_}");␊ |
153 | register_generic_command("*fbox,{_}");␊ |
154 | register_generic_command("fnsymbol,{}");␊ |
155 | register_generic_command("*footnote,[]{_}");␊ |
156 | register_generic_command("*footnotemark,[]");␊ |
157 | register_generic_command("*footnotetext,[]{_}");␊ |
158 | register_generic_command("frac,{_}{_}");␊ |
159 | register_generic_command("*frame,{_}");␊ |
160 | register_generic_command("*framebox,[][]{_}"); # There is another form in picture environment␊ |
161 | register_generic_command("*hbox,{}");␊ |
162 | register_generic_command("*hspace,[]{}");␊ |
163 | register_generic_command("*hyphenation,{_}"); # Translators may wish to add/remove words␊ |
164 | register_generic_command("*include,{}");␊ |
165 | #register_generic_command("includeonly,{}"); # should not be supported for now␊ |
166 | register_generic_command("*index,{_}");␊ |
167 | register_generic_command("*input,{}");␊ |
168 | register_generic_command("*item,[_]");␊ |
169 | register_generic_command("*label,{}");␊ |
170 | register_generic_command("lefteqn,{_}");␊ |
171 | register_generic_command("line,"); # The first argument is (x,y)␊ |
172 | register_generic_command("*linebreak,[]");␊ |
173 | register_generic_command("linethickness,{}");␊ |
174 | register_generic_command("location,{_}");␊ |
175 | register_generic_command("makebox,[][]{_}"); # There's another form in picture environment␊ |
176 | register_generic_command("makelabels,{}");␊ |
177 | register_generic_command("*markboth,[]{_}{_}");␊ |
178 | register_generic_command("*markright,{_}");␊ |
179 | register_generic_command("mathcal,{_}");␊ |
180 | register_generic_command("mathop,{_}");␊ |
181 | register_generic_command("mbox,{_}");␊ |
182 | register_generic_command("multicolumn,{}{}{_}");␊ |
183 | register_generic_command("multiput,"); # The first arguments are (x,y)(dx,dy)␊ |
184 | register_generic_command("name,{_}");␊ |
185 | register_generic_command("*newcommand,{}[][]{_}");␊ |
186 | register_generic_command("*newcounter,{}[]");␊ |
187 | register_generic_command("*newenvironment,{}[]{_}{_}");␊ |
188 | register_generic_command("*newfont,{}{}");␊ |
189 | register_generic_command("*newlength,{}");␊ |
190 | register_generic_command("*newsavebox,{}");␊ |
191 | register_generic_command("*newtheorem,{}{_}"); # Two forms, the optionnal arg is not the first one␊ |
192 | register_generic_command("nocite,{}");␊ |
193 | register_generic_command("nolinebreak,[]");␊ |
194 | register_generic_command("*nopagebreak,[]");␊ |
195 | register_generic_command("opening,{_}");␊ |
196 | register_generic_command("oval,"); # The first argument is (w,h)␊ |
197 | register_generic_command("overbrace,{_}");␊ |
198 | register_generic_command("overline,{_}");␊ |
199 | register_generic_command("*pagebreak,[]");␊ |
200 | register_generic_command("*pagenumbering,{_}");␊ |
201 | register_generic_command("pageref,{}");␊ |
202 | register_generic_command("*pagestyle,{}");␊ |
203 | register_generic_command("*parbox,[][][]{}{_}");␊ |
204 | register_generic_command("providecommand,{}[][]{_}");␊ |
205 | register_generic_command("put,"); # The first argument is (x,y)␊ |
206 | register_generic_command("raisebox,{}[][]{_}");␊ |
207 | register_generic_command("ref,{}");␊ |
208 | register_generic_command("*refstepcounter,{}");␊ |
209 | register_generic_command("*renewcommand,{}[][]{_}");␊ |
210 | register_generic_command("*renewenvironment,{}[]{_}{_}");␊ |
211 | register_generic_command("roman,{}"); # another language may not want a roman numbering␊ |
212 | register_generic_command("rule,[]{}{}");␊ |
213 | register_generic_command("savebox,{}"); # Optional arguments in 2nd & 3rd position␊ |
214 | register_generic_command("sbox,{}{_}");␊ |
215 | register_generic_command("*setcounter,{}{}");␊ |
216 | register_generic_command("*setlength,{}{}");␊ |
217 | register_generic_command("*settodepth,{}{_}");␊ |
218 | register_generic_command("*settoheight,{}{_}");␊ |
219 | register_generic_command("*settowidth,{}{_}");␊ |
220 | register_generic_command("shortstack,[]{_}");␊ |
221 | register_generic_command("signature,{_}");␊ |
222 | register_generic_command("sqrt,[_]{_}");␊ |
223 | register_generic_command("stackrel,{_}{_}");␊ |
224 | register_generic_command("stepcounter,{}");␊ |
225 | register_generic_command("*subfigure,[_]{_}");␊ |
226 | register_generic_command("symbol,{_}");␊ |
227 | register_generic_command("telephone,{_}");␊ |
228 | register_generic_command("thanks,{_}");␊ |
229 | register_generic_command("*thispagestyle,{}");␊ |
230 | register_generic_command("*title,{_}");␊ |
231 | register_generic_command("typeout,{_}");␊ |
232 | register_generic_command("typein,[]{_}");␊ |
233 | register_generic_command("twocolumn,[_]");␊ |
234 | register_generic_command("underbrace,{_}");␊ |
235 | register_generic_command("underline,{_}");␊ |
236 | register_generic_command("*usebox,{}");␊ |
237 | register_generic_command("usecounter,{}");␊ |
238 | register_generic_command("*usepackage,[]{}");␊ |
239 | register_generic_command("value,{}");␊ |
240 | register_generic_command("vector,"); # The first argument is (x,y)␊ |
241 | register_generic_command("vphantom,{_}");␊ |
242 | register_generic_command("*vspace,[]{}");␊ |
243 | register_generic_command("*vbox,{}");␊ |
244 | register_generic_command("*vcenter,{}");␊ |
245 | ␊ |
246 | register_generic_command("*part,[_]{_}");␊ |
247 | register_generic_command("*chapter,[_]{_}");␊ |
248 | register_generic_command("*section,[_]{_}");␊ |
249 | register_generic_command("*subsection,[_]{_}");␊ |
250 | register_generic_command("*subsubsection,[_]{_}");␊ |
251 | register_generic_command("*paragraph,[_]{_}");␊ |
252 | register_generic_command("*subparagraph,[_]{_}");␊ |
253 | ␊ |
254 | register_generic_command("textrm,{_}");␊ |
255 | register_generic_command("textit,{_}");␊ |
256 | register_generic_command("emph,{_}");␊ |
257 | register_generic_command("textmd,{_}");␊ |
258 | register_generic_command("textbf,{_}");␊ |
259 | register_generic_command("textup,{_}");␊ |
260 | register_generic_command("textsl,{_}");␊ |
261 | register_generic_command("textsf,{_}");␊ |
262 | register_generic_command("textsc,{_}");␊ |
263 | register_generic_command("texttt,{_}");␊ |
264 | register_generic_command("textnormal,{_}");␊ |
265 | register_generic_command("mathrm,{_}");␊ |
266 | register_generic_command("mathsf,{_}");␊ |
267 | register_generic_command("mathtt,{_}");␊ |
268 | register_generic_command("mathit,{_}");␊ |
269 | register_generic_command("mathnormal,{_}");␊ |
270 | register_generic_command("mathversion,{}");␊ |
271 | ␊ |
272 | register_generic_command("*contentspage,");␊ |
273 | register_generic_command("*tablelistpage,");␊ |
274 | register_generic_command("*figurepage,");␊ |
275 | ␊ |
276 | register_generic_command("*PassOptionsToPackage,{}{}");␊ |
277 | ␊ |
278 | register_generic_command("*ifthenelse,{}{_}{_}");␊ |
279 | ␊ |
280 | # graphics␊ |
281 | register_generic_command("*includegraphics,[]{}");␊ |
282 | register_generic_command("*graphicspath,{}");␊ |
283 | register_generic_command("*resizebox,{}{}{_}");␊ |
284 | register_generic_command("*scalebox,{}{_}");␊ |
285 | register_generic_command("*rotatebox,{}{_}");␊ |
286 | ␊ |
287 | # url␊ |
288 | register_generic_command("UrlFont,{}");␊ |
289 | register_generic_command("*urlstyle,{}");␊ |
290 | ␊ |
291 | # hyperref␊ |
292 | register_generic_command("href,{}{_}"); # 1:URL␊ |
293 | register_generic_command("url,{}"); # URL␊ |
294 | register_generic_command("nolinkurl,{}"); # URL␊ |
295 | register_generic_command("hyperbaseurl,{}"); # URL␊ |
296 | register_generic_command("hyperimage,{}"); # URL␊ |
297 | register_generic_command("hyperdef,{}{}{_}"); # 1:category, 2:name␊ |
298 | register_generic_command("hyperref,{}{}{}{_}"); # 1:URL, 2:category, 3:name␊ |
299 | register_generic_command("hyperlink,{}{_}"); # 1:name␊ |
300 | register_generic_command("*hypersetup,{_}");␊ |
301 | register_generic_command("hypertarget,{}{_}"); # 1:name␊ |
302 | register_generic_command("autoref,{}"); # 1:label␊ |
303 | ␊ |
304 | register_generic_command("*selectlanguage,{}");␊ |
305 | ␊ |
306 | # color␊ |
307 | register_generic_command("*definecolor,{}{}{}");␊ |
308 | register_generic_command("*textcolor,{}{_}");␊ |
309 | register_generic_command("*colorbox,{}{_}");␊ |
310 | register_generic_command("*fcolorbox,{}{}{_}");␊ |
311 | register_generic_command("*pagecolor,{_}");␊ |
312 | register_generic_command("*color,{}");␊ |
313 | ␊ |
314 | # equations/theorems␊ |
315 | register_generic_command("*qedhere,");␊ |
316 | register_generic_command("*qedsymbol,");␊ |
317 | register_generic_command("*theoremstyle,{}");␊ |
318 | register_generic_command("*proclaim,{_}");␊ |
319 | register_generic_command("*endproclaim,");␊ |
320 | register_generic_command("*shoveleft,{_}");␊ |
321 | register_generic_command("*shoveright,{_}");␊ |
322 | ␊ |
323 | # commands without arguments. This is better than untranslated or␊ |
324 | # translate_joined because the number of arguments will be checked.␊ |
325 | foreach (qw(a *appendix *backmatter backslash *baselineskip *baselinestretch bf␊ |
326 | *bigskip boldmath cal cdots *centering *cleardoublepage *clearpage␊ |
327 | ddots dotfill em flushbottom *footnotesize frenchspacing␊ |
328 | *frontmatter *glossary *hfill *hline hrulefill huge Huge indent it␊ |
329 | kill large Large LARGE ldots left linewidth listoffigures␊ |
330 | listoftables *mainmatter *makeatletter *makeglossary *makeindex␊ |
331 | *maketitle *medskip *newline *newpage noindent nonumber *normalsize␊ |
332 | not *null *onecolumn *par parindent *parskip *printindex protect ps␊ |
333 | pushtabs *qquad *quad raggedbottom raggedleft raggedright right rm␊ |
334 | sc scriptsize sf sl small *smallskip *startbreaks *stopbreaks␊ |
335 | *tableofcontents textwidth textheight tiny today tt unitlength␊ |
336 | vdots verb *vfill *vline *fussy *sloppy␊ |
337 | ␊ |
338 | aleph hbar imath jmath ell wp Re Im prime nabla surd angle forall␊ |
339 | exists partial infty triangle Box Diamond flat natural sharp␊ |
340 | clubsuit diamondsuit heartsuit spadesuit dag ddag S P copyright␊ |
341 | pounds Delta ASCII␊ |
342 | ␊ |
343 | rmfamily itshape mdseries bfseries upshape slshape sffamily scshape␊ |
344 | ttfamily *normalfont width height depth totalheight␊ |
345 | ␊ |
346 | *fboxsep *fboxrule␊ |
347 | *itemi *itemii *itemiii *itemiv␊ |
348 | *theitemi *theitemii *theitemiii *theitemiv)) {␊ |
349 | register_generic_command("$_,");␊ |
350 | }␊ |
351 | ␊ |
352 | ␊ |
353 | ␊ |
354 | # standard environments.␊ |
355 | # FIXME: All these definitions should be re-checked␊ |
356 | foreach (qw(abstract align align* cases center description displaymath document enumerate␊ |
357 | eqnarray eqnarray* equation equation* flushleft flushright footnotesize itemize␊ |
358 | letter lrbox multline multline* proof quotation quote␊ |
359 | sloppypar tabbing theorem titlepage␊ |
360 | trivlist verbatim verbatim* verse wrapfigure)) {␊ |
361 | register_generic_environment("$_,");␊ |
362 | }␊ |
363 | register_generic_environment("tabular,[]{}");␊ |
364 | register_generic_environment("tabular*,{}{}");␊ |
365 | register_generic_environment("tabularx,{}{}");␊ |
366 | register_generic_environment("multicols,{}");␊ |
367 | register_generic_environment("list,{_}{}");␊ |
368 | register_generic_environment("array,[]{}");␊ |
369 | register_generic_environment("figure,[]");␊ |
370 | register_generic_environment("minipage,[]{}");␊ |
371 | register_generic_environment("picture,{}{}");␊ |
372 | register_generic_environment("table,[]");␊ |
373 | register_generic_environment("thebibliography,{_}");␊ |
374 | ␊ |
375 | ␊ |
376 | # Commands and environments with separators.␊ |
377 | ␊ |
378 | # & is the cell separator, \\ is the line separator␊ |
379 | # '\' is escaped twice␊ |
380 | $env_separators{'array'} =␊ |
381 | $env_separators{'tabular'} =␊ |
382 | $env_separators{'tabularx'} = "(?:&|\\\\\\\\|\\\\hline)";␊ |
383 | ␊ |
384 | $env_separators{'trivlist'} =␊ |
385 | $env_separators{'list'} =␊ |
386 | $env_separators{'description'} =␊ |
387 | $env_separators{'enumerate'} =␊ |
388 | $env_separators{'itemize'} = "\\\\item";␊ |
389 | ␊ |
390 | $env_separators{'thebibliography'} = "\\\\bibitem";␊ |
391 | ␊ |
392 | $env_separators{'displaymath'} =␊ |
393 | $env_separators{'eqnarray'} =␊ |
394 | $env_separators{'eqnarray*'} =␊ |
395 | $env_separators{'flushleft'} =␊ |
396 | $env_separators{'flushright'} =␊ |
397 | $env_separators{'center'} =␊ |
398 | $env_separators{'author{#1}'} =␊ |
399 | $env_separators{'title{#1}'} = "\\\\\\\\";␊ |
400 | ␊ |
401 | # tabbing␊ |
402 | ␊ |
403 | 1;␊ |
404 | |