1 # -*- coding: utf-8 -*-
6 import book_base as BookBase
7 from book_snippets import *
11 progress = ly.progress
15 # Recognize special sequences in the input.
17 # (?P<name>regex) -- Assign result of REGEX to NAME.
18 # *? -- Match non-greedily.
19 # (?!...) -- Match if `...' doesn't match next (without consuming
22 # (?m) -- Multiline regex: Make ^ and $ match at each line.
23 # (?s) -- Make the dot match all characters including newline.
24 # (?x) -- Ignore whitespace in patterns.
26 # 'multiline_comment', 'verbatim', 'lilypond_block', 'singleline_comment',
27 # 'lilypond_file', 'include', 'lilypond', 'lilypondversion'
43 \s*(?P<options>.*?)\s*
52 \\begin\s*(?P<env>{lilypond}\s*)?(
54 \s*(?P<options>.*?)\s*
55 \])?(?(env)|\s*{lilypond})
58 \\end\s*{lilypond})''',
66 \s*(?P<options>.*?)\s*
77 \s*(?P<options>.*?)\s*
105 \\end\s*{verbatim}))''',
110 \\lilypondversion)[^a-zA-Z]''',
114 FILTER: r'''\begin{lilypond}[%(options)s]
121 \ifx\preLilyPondExample \undefined
123 \expandafter\preLilyPondExample
125 \def\lilypondbook{}%%
126 \input %(base)s-systems.tex
127 \ifx\postLilyPondExample \undefined
129 \expandafter\postLilyPondExample
133 PRINTFILENAME: '''\\texttt{%(filename)s}
136 QUOTE: r'''\begin{quotation}
140 VERBATIM: r'''\noindent
141 \begin{verbatim}%(verb)s\end{verbatim}
144 VERSION: r'''%(program_version)s''',
152 # Retrieve dimensions from LaTeX
153 LATEX_INSPECTION_DOCUMENT = r'''
157 \typeout{textwidth=\the\textwidth}
158 \typeout{columnsep=\the\columnsep}
159 \makeatletter\if@twocolumn\typeout{columns=2}\fi\makeatother
163 # Do we need anything else besides `textwidth'?
164 def get_latex_textwidth (source, global_options):
165 m = re.search (r'''(?P<preamble>\\begin\s*{document})''', source)
167 warning (_ ("cannot find \\begin{document} in LaTeX document"))
169 ## what's a sensible default?
172 preamble = source[:m.start (0)]
173 latex_document = LATEX_INSPECTION_DOCUMENT % {'preamble': preamble}
175 (handle, tmpfile) = tempfile.mkstemp('.tex')
176 logfile = os.path.splitext (tmpfile)[0] + '.log'
177 logfile = os.path.split (logfile)[1]
179 tmp_handle = os.fdopen (handle,'w')
180 tmp_handle.write (latex_document)
183 ly.system ('%s %s' % (global_options.latex_program, tmpfile),
184 be_verbose=global_options.verbose)
185 parameter_string = file (logfile).read()
191 m = re.search ('columns=([0-9.]+)', parameter_string)
193 columns = int (m.group (1))
196 m = re.search ('columnsep=([0-9.]+)pt', parameter_string)
198 columnsep = float (m.group (1))
201 m = re.search ('textwidth=([0-9.]+)pt', parameter_string)
203 textwidth = float (m.group (1))
205 textwidth = (textwidth - columnsep) / columns
210 def modify_preamble (chunk):
211 str = chunk.replacement_text ()
212 if (re.search (r"\\begin *{document}", str)
213 and not re.search ("{graphic[sx]", str)):
214 str = re.sub (r"\\begin{document}",
215 r"\\usepackage{graphics}" + '\n'
216 + r"\\begin{document}",
218 chunk.override_text = str
225 class BookLatexOutputFormat (BookBase.BookOutputFormat):
227 BookBase.BookOutputFormat.__init__ (self)
228 self.format = "latex"
229 self.default_extension = ".tex"
230 self.snippet_res = Latex_snippet_res
231 self.output = Latex_output
232 self.handled_extensions = ['.latex', '.lytex', '.tex']
233 self.image_formats = "ps"
234 self.snippet_option_separator = '\s*,\s*'
236 def process_options (self, global_options):
237 self.process_options_pdfnotdefault (global_options)
239 def get_line_width (self, source):
240 textwidth = get_latex_textwidth (source, self.global_options)
241 return '%.0f\\pt' % textwidth
243 def input_fullname (self, input_filename):
244 # Use kpsewhich if available, otherwise fall back to the default:
245 if ly.search_exe_path ('kpsewhich'):
246 return os.popen ('kpsewhich ' + input_filename).read()[:-1]
248 return BookBase.BookOutputFormat.input_fullname (self, input_filename)
250 def process_chunks (self, chunks):
252 if (c.is_plain () and
253 re.search (r"\\begin *{document}", c.replacement_text())):
258 def snippet_output (self, basename, snippet):
260 rep = snippet.get_replacements ();
261 rep['base'] = basename
262 str += self.output_print_filename (basename, snippet)
263 if VERBATIM in snippet.option_dict:
264 rep['verb'] = snippet.verb_ly ()
265 str += self.output[VERBATIM] % rep
267 str += self.output[OUTPUT] % rep
269 ## todo: maintain breaks
271 breaks = snippet.ly ().count ("\n")
272 str += "".ljust (breaks, "\n").replace ("\n","%\n")
274 if QUOTE in snippet.option_dict:
275 str = self.output[QUOTE] % {'str': str}
281 BookBase.register_format (BookLatexOutputFormat ());