diff options
Diffstat (limited to 'org/output_latex.org')
-rw-r--r-- | org/output_latex.org | 1879 |
1 files changed, 0 insertions, 1879 deletions
diff --git a/org/output_latex.org b/org/output_latex.org deleted file mode 100644 index f9c6d55..0000000 --- a/org/output_latex.org +++ /dev/null @@ -1,1879 +0,0 @@ --*- mode: org -*- -#+TITLE: spine (doc_reform) output latex -#+DESCRIPTION: documents - structuring, publishing in multiple formats & search -#+FILETAGS: :spine:output:latex:pdf: -#+AUTHOR: Ralph Amissah -#+EMAIL: [[mailto:ralph.amissah@gmail.com][ralph.amissah@gmail.com]] -#+COPYRIGHT: Copyright (C) 2015 - 2019 Ralph Amissah -#+LANGUAGE: en -#+STARTUP: indent content hideblocks hidestars -#+OPTIONS: H:3 num:nil toc:t \n:nil @:t ::t |:t ^:nil _:nil -:t f:t *:t <:t -#+OPTIONS: TeX:t LaTeX:t skip:nil d:nil todo:t pri:nil tags:not-in-toc -#+OPTIONS: author:nil email:nil creator:nil timestamp:nil -#+PROPERTY: header-args :results silent :padline no :exports code :cache no :noweb yes -#+EXPORT_SELECT_TAGS: export - -- [[./spine.org][spine]] [[./][org/]] -- [[./output_hub.org][output_hub]] - -* latex -** _module template_ :latex:pdf:module: - -#+BEGIN_SRC d :tangle "../src/doc_reform/output/latex.d" :noweb yes -module doc_reform.output.latex; -template outputLaTeX() { - <<output_latex_imports>> - mixin InternalMarkup; // watch - mixin DocReformOutputRgxInit; - auto rgx = Rgx(); - mixin DocReformLanguageCodes; - auto lang = Lang(); - <<output_latex_shared>> -<<output_latex_shared_0>> - <<output_latex_head>> - <<output_latex_head_1_format_string>> -<<output_latex_head_1_tex>> - <<output_latex_head_1_format_string_variables>> - <<output_latex_head_0_format_string>> -<<output_latex_head_0_tex>> - <<output_latex_head_0_format_string_variables>> - <<output_latex_head_close>> - <<output_latex_body>> - <<output_latex_tail>> -<<output_latex_tail_tex>> - <<output_latex_tail_close>> - <<output_latex>> -} -#+END_SRC - -** write latex output :latex:out: - -#+name: output_latex -#+BEGIN_SRC d -void writeOutputLaTeX(T,M)( - const T latex_content, - M doc_matters, -) { - auto pth_latex = DocReformPathsLaTeX(doc_matters); - try { - { /+ debug +/ - if (doc_matters.opt.action.debug_do - && doc_matters.opt.action.verbose) { - writeln(latex_content.head); - writeln(latex_content.content); - writeln(latex_content.tail); - } - } - if (!exists(pth_latex.latex_path_stuff)) { - (pth_latex.latex_path_stuff).mkdirRecurse; - } - if (!(doc_matters.opt.action.quiet)) { - writeln(" ", pth_latex.latex_file_with_path); - } - auto f = File(pth_latex.latex_file_with_path, "w"); - f.writeln(latex_content.head); - f.writeln(latex_content.content); - f.writeln(latex_content.tail); - foreach (image; doc_matters.srcs.image_list) { - auto fn_src_in = doc_matters.src.image_dir_path ~ "/" ~ image; - auto fn_src_out_file = pth_latex.latex_path_stuff ~ "/" ~ image; - if (exists(fn_src_in)) { - fn_src_in.copy(fn_src_out_file); - } - } - } catch (ErrnoException ex) { - // handle error - } -} -#+END_SRC - -** latex output hub [#A] :latex:pdf:out: - -#+name: output_latex -#+BEGIN_SRC d -void outputLaTeX(D,M)( - const D doc_abstraction, - M doc_matters, -) { - struct LaTeX { - string head; - string content; - string tail; - } - auto latex = LaTeX(); - latex.head = latex_head(doc_matters); - latex.content = latex_body(doc_abstraction, doc_matters); - latex.tail = latex_tail(doc_matters); - latex.writeOutputLaTeX(doc_matters); -} -#+END_SRC - -* stuff -** output imports - -#+name: output_latex_imports -#+BEGIN_SRC d -import doc_reform.output; -import - std.digest.sha, - std.file, - std.outbuffer, - std.uri, - std.conv : to; -#+END_SRC - -** shared -*** paper dimensions (struct) - -#+name: output_latex_shared -#+BEGIN_SRC d - auto paper() { - struct PaperType { - auto a4() { - struct A4 { - auto portrait() { - struct V { - uint w = 160; - uint h = 228; - uint img_px = 450; - } - return V(); - } - auto landscape() { - struct H { - uint w = 238; - uint h = 160; - uint img_px = 300; - } - return H(); - } - } - return A4(); - } - auto a5() { - struct A5 { - auto portrait() { - struct V { - uint w = 112; - uint h = 162; - uint img_px = 280; - } - return V(); - } - auto landscape() { - struct H { - uint w = 152; - uint h = 100; - uint img_px = 190; - } - return H(); - } - } - return A5(); - } - auto b4() { - struct B4 { - auto portrait() { - struct V { - uint w = 140; - uint h = 204; - uint img_px = 356; - } - return V(); - } - auto landscape() { - struct H { - uint w = 200; - uint h = 130; - uint img_px = 260; - } - return H(); - } - } - return B4(); - } - auto letter() { - struct Letter { - auto portrait() { - struct V { - uint w = 166; - uint h = 212; - uint img_px = 468; - } - return V(); - } - auto landscape() { - struct H { - uint w = 226; - uint h = 166; - uint img_px = 290; - } - return H(); - } - } - return Letter(); - } - auto legal() { - struct Legal { - auto portrait() { - struct V { - uint w = 168; - uint h = 286; - uint img_px = 474; - } - return V(); - } - auto landscape() { - struct H { - uint w = 296; - uint h = 166; - uint img_px = 420; - } - return H(); - } - } - return Legal(); - } - } - return PaperType(); - } -#+END_SRC - -*** latex \escape special characters -**** general - -#+name: output_latex_shared -#+BEGIN_SRC d -string sp_char_esc(O)( - string _txt, - const O obj, -) { - string _unescape_sp_char_esc()(string _txt) { - _txt = _txt - .replaceAll(rgx.latex_special_char_escaped, - format(q"┃%s┃", "$1")) - .replaceAll(rgx.latex_special_char_escaped_braced, - format(q"┃%s┃", "$1")); - return _txt; - } - string _unescape_fontface_esc()(string _txt) { - _txt = _txt.replaceAll(rgx.latex_identify_inline_fontface, - format(q"┃%s%s┃", "$1", "$2")); - return _txt; - } - if (obj.metainfo.is_a != "code") { - _txt = replaceAll!(m => "\\" ~ m[1])(_txt, rgx.latex_special_char_for_escape); - _txt = replaceAll!(m => "{\\" ~ m[1] ~ "}")(_txt, rgx.latex_special_char_for_escape_and_braces); - _txt = replaceAll!(m => _unescape_sp_char_esc(m[0]))(_txt, rgx.latex_identify_inline_link); - _txt = replaceAll!(m => _unescape_fontface_esc(m[0]))(_txt, rgx.latex_identify_inline_fontface); - } - return _txt; -} -#+END_SRC - -#+name: output_latex_shared -#+BEGIN_SRC d -string sp_char_esc_txt()( - string _txt, -) { - string _unescape_sp_char_esc()(string _txt) { - _txt = _txt - .replaceAll(rgx.latex_special_char_escaped, - format(q"┃%s┃", "$1")) - .replaceAll(rgx.latex_special_char_escaped_braced, - format(q"┃%s┃", "$1")); - return _txt; - } - string _unescape_fontface_esc()(string _txt) { - _txt = _txt.replaceAll(rgx.latex_identify_inline_fontface, - format(q"┃%s%s┃", "$1", "$2")); - return _txt; - } - _txt = replaceAll!(m => "\\" ~ m[1])(_txt, rgx.latex_special_char_for_escape); - _txt = replaceAll!(m => "{\\" ~ m[1] ~ "}")(_txt, rgx.latex_special_char_for_escape_and_braces); - _txt = replaceAll!(m => _unescape_sp_char_esc(m[0]))(_txt, rgx.latex_identify_inline_link); - _txt = replaceAll!(m => _unescape_fontface_esc(m[0]))(_txt, rgx.latex_identify_inline_fontface); - return _txt; -} -#+END_SRC - -*** not used latex \escape special characters - -#+BEGIN_SRC d -string sp_char_esc()( - string _txt, -) { - _txt = replaceAll!(m => "\\" ~ m[1])(_txt, rgx.latex_special_char); - return _txt; -} -#+END_SRC - -*** inline markup -**** fontface - -- bold, italics, underscore, strikethrough - -#+name: output_latex_shared -#+BEGIN_SRC d -string fontface()( - string _txt, -) { -_txt = _txt - .replaceAll(rgx.inline_emphasis, format(q"┃\begin{bfseries}%s\end{bfseries}┃", "$1")) - .replaceAll(rgx.inline_bold, format(q"┃\begin{bfseries}%s\end{bfseries}┃", "$1")) - .replaceAll(rgx.inline_italics, format(q"┃\emph{%s}┃", "$1")) - .replaceAll(rgx.inline_italics, format(q"┃\uline{%s}┃", "$1")) - .replaceAll(rgx.inline_superscript, format(q"┃$$^{\textrm{%s}}$$┃", "$1")) - .replaceAll(rgx.inline_subscript, format(q"┃$$_{\textrm{%s}}$$┃", "$1")) - .replaceAll(rgx.inline_strike, format(q"┃\sout{%s}┃", "$1")) - .replaceAll(rgx.inline_insert, format(q"┃\uline{%s}┃", "$1")) - .replaceAll(rgx.inline_mono, format(q"┃\begin{monosp}%s\end{monosp}┃", "$1")) - .replaceAll(rgx.inline_italics, format(q"┃``%s''┃", "$1")); - return _txt; -} -#+END_SRC - -**** spaces -***** leading hardspace - -#+name: output_latex_shared -#+BEGIN_SRC d -string leading_hardspaces()( - string _txt, -) { - string hardspaces(string _spaces) { - _spaces = _spaces - .replaceAll(rgx.space, "\\hardspace "); - return _spaces; - } - _txt = replaceAll!(m => hardspaces(m[0]))(_txt, rgx.spaces_line_start); - return _txt; -} -#+END_SRC - -***** nbsp character - -#+name: output_latex_shared -#+BEGIN_SRC d -string nbsp_char()(string _txt) { - if (_txt.match(rgx.nbsp_char)) { - _txt = _txt.replaceAll(rgx.nbsp_char, "\\hardspace "); - } - return _txt; -} -#+END_SRC - -***** remove nbsp character - -#+name: output_latex_shared -#+BEGIN_SRC d -string nbsp_char_to_space()(string _txt) { - if (_txt.match(rgx.nbsp_char)) { - _txt = _txt.replaceAll(rgx.nbsp_char, " "); - } - return _txt; -} -#+END_SRC - -**** links and images -***** links / urls - -#+name: output_latex_shared -#+BEGIN_SRC d -string links_and_images(O,M)( - string _txt, - const O obj, - M doc_matters, -) { - if (obj.has.inline_links) { // TODO some images do not have inline links ... image without link - string _width_adjust(string _width) { - if (_width.to!int > 300) { _width = "300"; } // will need to vary max with papersize & orientation - return _width; - } - string _latex_image_path(string _image_path) { - auto pth_latex = DocReformPathsLaTeX(doc_matters); - _image_path = pth_latex.latex_path_stuff ~ "/" ~ _image_path; - return _image_path; - } - string _if_images(string _linked_content) { - if (_linked_content.match(rgx.inline_image_info)) { - _linked_content = replaceAll!(m => - format(q"┃\includegraphics*[width=%spt]{%s}%s┃", - _width_adjust(m[2]), _latex_image_path(m[1]), " \\\\\n") - )(_linked_content, rgx.inline_image_info); - } - return _linked_content; - } - string _check_link(string _link) { - _link = _link - .replaceFirst(rgx.latex_clean_internal_link, "") - .replaceAll(rgx.latex_special_char_for_escape_url, "\\$1"); - return _link; - } - if (obj.metainfo.is_a != "code") { - _txt = replaceAll!(m => - m[1] ~ "┤" ~ to!string((obj.stow.link[m[2].to!ulong])).encode ~ "├" - )(_txt, rgx.inline_link_number_only); - _txt = replaceAll!(m => - ((m[1] == m[2]) && (m[2].match(rgx.uri))) - ? format(q"┃\begin{scriptsize}\lefthalfcap\url{%s}\righthalfcup\end{scriptsize}┃", _check_link(m[1])) - : (m[2].match(rgx.uri)) // ERROR - ? format(q"┃%s\href{%s}%s{%s}┃", "\\\\\n", _check_link(m[2]), "\n", _if_images(m[1])) - : format(q"┃\hyperlink{%s}{%s}┃", _check_link(m[2]), _if_images(m[1])) - )(_txt, rgx.inline_link); - } - } - return _txt; -} -#+END_SRC - -*** footnotes -**** footnotes - -#+name: output_latex_shared -#+BEGIN_SRC d -string footnotes()( - string _txt, -) { - if (_txt.match(rgx.inline_notes_al_gen)) { - string _tex_note = q"┃\hypertarget{noteref_%s}{}\footnote[%s]{%% -\label{note_%s}%s}┃"; - _txt = _txt.replaceAll(rgx.inline_notes_al_regular_number_note, - format(_tex_note, - "$1", "$1", "$1", - "$2".strip - ).strip - ); - } - return _txt; -} -#+END_SRC - -**** footnote remove - -#+name: output_latex_shared -#+BEGIN_SRC d -string remove_footnotes()( - string _txt, -) { - if (_txt.match(rgx.inline_notes_al_gen)) { - _txt = replaceAll!(m => "")(_txt, rgx.inline_notes_al_gen); - } - return _txt; -} -#+END_SRC - -*** para -**** para - -#+name: output_latex_shared -#+BEGIN_SRC d -string para(O)( - string _txt, - O obj, -) { - if (obj.metainfo.is_of_type == "para") { - string _tex_para; - _tex_para = q"┃\begin{tiny}\hspace{0mm}\end{tiny}{\marginpar{\begin{tiny}\hspace{0mm}\hypertarget{%s}{%s}\end{tiny}}}%s┃"; - _txt = format(_tex_para, - obj.metainfo.object_number, - obj.metainfo.object_number, - _txt.footnotes - ).strip; - } - return _txt; -} -#+END_SRC - -**** bookindex para - -#+name: output_latex_shared -#+BEGIN_SRC d -string bookindex(O)( - string _txt, - O obj, -) { - if (obj.metainfo.is_of_type == "para" - && obj.metainfo.is_a == "bookindex" - ) { - string _tex_para; - _tex_para = q"┃%s┃"; - _txt = format(_tex_para, - _txt.replaceAll(rgx.latex_clean_bookindex_linebreak, "\n") ~ "\n\\\\\n" - ); - } - return _txt; -} -#+END_SRC - -*** bullets & indentation - -#+name: output_latex_head -#+BEGIN_SRC d -string bullets_and_indentation(O)( - string _txt, - O obj, -) { - string _tex_para; - string _hang; string _indent; - int _paper_margin = -10; - int _indent_increment = 8; // 5; 10; - if (obj.attrib.bullet) { - int _bullet_space = 5; - _indent = ((obj.attrib.indent_base * _indent_increment) + _paper_margin + _bullet_space).to!string; - _txt = format(q"┃\begin{Bullet}{%smm}$\txtbullet$\hspace{\enspace}%s\end{Bullet}┃", - _indent, - _txt.footnotes - ).strip; - } else if ( - obj.attrib.indent_base != 0 - && obj.attrib.indent_base == obj.attrib.indent_hang - ) { - _indent = ((obj.attrib.indent_base * _indent_increment) + _paper_margin).to!string; - _tex_para = q"┃\begin{ParagraphIndent}{%smm}%s \end{ParagraphIndent}┃"; - _txt = format(_tex_para, - _indent, - _txt.footnotes - ).strip; - } else if ( - obj.attrib.indent_base != 0 - || obj.attrib.indent_hang != 0 - ) { - _indent = ((obj.attrib.indent_base * _indent_increment) + _paper_margin).to!string; - _hang = (((obj.attrib.indent_hang - obj.attrib.indent_base) * _indent_increment)).to!string; - _tex_para = q"┃\begin{ParagraphHang}{%smm}{%smm}%s \end{ParagraphHang}┃"; - _txt = format(_tex_para, - _indent, _hang, - _txt.footnotes - ).strip; - } - return _txt; -} -#+END_SRC - -*** heading - -#+name: output_latex_shared_0 -#+BEGIN_SRC d - string heading(O,M)( - string _txt, - O obj, - M doc_matters, - string _part = "" - ) { - if (obj.metainfo.is_a == "heading") { - string _tex_para; - string _pg_break; - string _sect; - string _post; - string _title_add; - string _columns = ""; - switch (obj.metainfo.heading_lev_markup) { - case 0: // A == TITLE - _pg_break = "\\begin{document}\n"; - goto default; - case 1: // B == part: section heading level - _pg_break = "\\clearpage\n"; - goto default; - case 2: // C == part: section heading level - _pg_break = "\\clearpage\n"; - goto default; - case 3: // D == part: section heading level - _pg_break = "\\clearpage\n"; - goto default; - case 4: // 1 == section - _columns = (_part != "bookindex") - ? "" : "\n\\\\\n\\begin{multicols}{2}"; - _pg_break = "\\clearpage\n"; - _sect = "section"; - _post = ""; - _title_add = format(q"┃ -\markboth{%s}{%s}┃", - doc_matters.conf_make_meta.meta.title_full, - doc_matters.conf_make_meta.meta.title_full, - ); - goto default; - case 5: // 2 == subsection - _pg_break = ""; - // _pg_break = "newpage"; // doubt this is necessary - _sect = "subsection"; - _post = " \\\n"; - _title_add = ""; - goto default; - case 6: // 3 == subsubsection - _pg_break = ""; - // _pg_break = "newpage"; // doubt this is necessary - _sect = "subsubsection"; - _post = " \\\n"; - _title_add = ""; - goto default; - default: - if (obj.metainfo.heading_lev_markup == 0) { - _tex_para = q"┃\begin{document} -\title{%s} -\author{ \textnormal{%s}} -\date{\begin{tiny}%s\end{tiny}} -\pagenumbering{roman}\maketitle -\pagestyle{fancy} -\newpage -\markboth{%s}{%s} -\\\\[3]\ \linebreak Copyright {\begin{small}{\copyright\end{small}} %s \\ -%s -\pagestyle{fancy} -\clearpage┃"; - _txt = format(_tex_para, - (doc_matters.conf_make_meta.meta.title_full).sp_char_esc_txt, - (doc_matters.conf_make_meta.meta.creator_author).sp_char_esc_txt, - (doc_matters.conf_make_meta.meta.date_published).sp_char_esc_txt, - (doc_matters.conf_make_meta.meta.title_main).sp_char_esc_txt, - (doc_matters.conf_make_meta.meta.title_full).sp_char_esc_txt, - (doc_matters.conf_make_meta.meta.rights_copyright).sp_char_esc_txt, - (doc_matters.conf_make_meta.meta.rights_license).sp_char_esc_txt, - ); - } else if (obj.metainfo.heading_lev_markup < 4) { - _tex_para = q"┃%s\part*{\begin{tiny}\hspace{0mm}\end{tiny}{\marginpar{\begin{tiny}\hspace{0mm}\hypertarget{%s}{%s}\end{tiny}}}%s} -\addcontentsline{toc}{part}{%s} -\markboth{%s}┃"; - _txt = format(_tex_para, - _pg_break, - obj.metainfo.object_number, - obj.metainfo.object_number, - _txt.strip.footnotes, - _txt.strip.remove_footnotes, - (doc_matters.conf_make_meta.meta.title_main).sp_char_esc_txt, - ); - } else if (obj.metainfo.heading_lev_markup > 3) { - if (obj.metainfo.heading_lev_markup == 4 - && _txt.match(regex(r"^Table of Contents$"))) { - _tex_para = q"┃ -\pagenumbering{none} -\setcounter{page}{1} -\setlength{\parskip}{1ex plus0.5ex minus0.2ex} -\part*{\begin{tiny}\hspace{0mm}\end{tiny}{\marginpar{\begin{tiny}\hspace{0mm}\hypertarget{1}{1}\end{tiny}}}%s \newline %s} - -\clearpage -\markboth{%s}{%s} -\pagenumbering{gobble} -\renewcommand{\contentsname}{} -\tableofcontents -\markboth{%s}{%s} - -\clearpage -\pagenumbering{arabic} -\setcounter{page}{1} -\markboth{%s}{%s} -%% \null -\clearpage -\setcounter{page}{1}┃"; - _txt = format(_tex_para, - (doc_matters.conf_make_meta.meta.title_full).sp_char_esc_txt, - (doc_matters.conf_make_meta.meta.creator_author).sp_char_esc_txt, - (doc_matters.conf_make_meta.meta.title_main).sp_char_esc_txt, - (doc_matters.conf_make_meta.meta.title_main).sp_char_esc_txt, - (doc_matters.conf_make_meta.meta.title_full).sp_char_esc_txt, - (doc_matters.conf_make_meta.meta.title_full).sp_char_esc_txt, - (doc_matters.conf_make_meta.meta.title_full).sp_char_esc_txt, - (doc_matters.conf_make_meta.meta.title_full).sp_char_esc_txt, - ); - } else if (obj.metainfo.heading_lev_markup == 4 - && _part == "bookindex" - && _txt.match(regex(r"^Index$")) - ) { - _tex_para = q"┃%s\%s*{\begin{tiny}\hspace{0mm}\end{tiny}{\marginpar{\begin{tiny}\hspace{0mm}\hypertarget{%s}{%s}\end{tiny}}}%s} -\addcontentsline{toc}{%s}{%s%s}%s%s┃"; - _txt = format(_tex_para, - _pg_break, - _sect.strip, - obj.metainfo.object_number, - obj.metainfo.object_number, - _txt.footnotes.strip, - _sect, - _txt.remove_footnotes.strip, - _post, - _title_add, - _columns, - ); - } else if (obj.metainfo.dummy_heading - && obj.metainfo.heading_lev_markup == 4 - ) { /+ dummy headings completely omitted +/ - _txt = ""; - } else { - _tex_para = q"┃%s\%s*{\begin{tiny}\hspace{0mm}\end{tiny}{\marginpar{\begin{tiny}\hspace{0mm}\hypertarget{%s}{%s}\end{tiny}}}%s} -\addcontentsline{toc}{%s}{%s%s}%s┃"; - _txt = format(_tex_para, - _pg_break, - _sect.strip, - obj.metainfo.object_number, - obj.metainfo.object_number, - _txt.footnotes.strip, - _sect, - _txt.remove_footnotes.strip, - _post, - _title_add, - ); - } - } - break; - } - } - return _txt.strip; - } -#+END_SRC - -*** grouped text -**** group - -- (hardspace not honored) clear hardspace marker - -#+name: output_latex_shared_0 -#+BEGIN_SRC d -string group(O,M)( - string _txt, - O obj, - M doc_matters, -) { - if (obj.metainfo.is_a == "group") { - string _tex_para; - _tex_para = q"┃\begin{tiny}\hspace{0mm}\end{tiny}{\marginpar{\begin{tiny}\hspace{0mm}\hypertarget{%s}{%s}\end{tiny}}}\setlength{\parskip}{0.5ex plus0.2ex minus0.1ex} -\begin{footnotesize} -%s -\end{footnotesize} -┃"; - _txt = format(_tex_para, - obj.metainfo.object_number, - obj.metainfo.object_number, - _txt.footnotes.strip - ).strip; - } - return _txt; -} -#+END_SRC - -**** block - -- (hardspace honored) \hardspace - -#+name: output_latex_shared_0 -#+BEGIN_SRC d -string block(O,M)( - string _txt, - O obj, - M doc_matters, -) { - if (obj.metainfo.is_a == "block") { - // _txt = _txt.nbsp_char; - string _tex_para; - _tex_para = q"┃\begin{tiny}\hspace{0mm}\end{tiny}{\marginpar{\begin{tiny}\hspace{0mm}\hypertarget{%s}{%s}\end{tiny}}}\setlength{\parskip}{0.5ex plus0.2ex minus0.1ex} -\begin{footnotesize} -%s -\end{footnotesize} -\setlength{\parskip}{1ex plus0.5ex minus0.2ex} -┃"; // \hardspace - /+ try both: +/ - _txt = _txt.split(rgx.br_newlines_linebreaks).join("\n\n"); // _txt = _txt.split(rgx.br_newlines_linebreaks).join(" \\\n"); - _txt = format(_tex_para, - obj.metainfo.object_number, - obj.metainfo.object_number, - _txt.nbsp_char.footnotes.strip - ).strip; - } - return _txt; -} -#+END_SRC - -**** verse - -- (hardspace honored) \hardspace - -#+name: output_latex_shared_0 -#+BEGIN_SRC d -string verse(O,M)( - string _txt, - O obj, - M doc_matters, -) { - if (obj.metainfo.is_a == "verse") { - string _tex_para; - _tex_para = q"┃\begin{tiny}\hspace{0mm}\end{tiny}{\marginpar{\begin{tiny}\hspace{0mm}\hypertarget{%s}{%s}\end{tiny}}}\setlength{\parskip}{0.1ex plus0.1ex minus0.1ex} -\begin{footnotesize} - -%s - -\end{footnotesize} -\setlength{\parskip}{1ex plus0.5ex minus0.2ex} -\linebreak -┃"; // \hardspace - _txt = format(_tex_para, - obj.metainfo.object_number, - obj.metainfo.object_number, - _txt.nbsp_char.footnotes.split("\n").join("\n\n").strip - ).strip; - } - return _txt; -} -#+END_SRC - -**** codeblock - -- (hardspace honored) \begin{lstlisting} clear hardspace marker - -#+name: output_latex_shared_0 -#+BEGIN_SRC d -string codeblock(O,M)( - string _txt, - O obj, - M doc_matters, -) { - if (obj.metainfo.is_a == "code") { - string _tex_para; - _tex_para = q"┃\begin{tiny}\hspace{0mm}\end{tiny}{\marginpar{\begin{tiny}\hspace{0mm}\hypertarget{%s}{%s}\end{tiny}}}\setlength{\parskip}{0.5ex plus0.2ex minus0.1ex}\begin{Codeblock} -\begin{lstlisting} -%s -\end{lstlisting} -\end{Codeblock} -\setlength{\parskip}{1ex plus0.5ex minus0.2ex} -┃"; - _txt = format(_tex_para, - obj.metainfo.object_number, - obj.metainfo.object_number, - _txt.nbsp_char_to_space - ).strip; - } - return _txt; -} -#+END_SRC - -**** table - -- own set of rules - -***** tablarize - -#+name: output_latex_shared_0 -#+BEGIN_SRC d -auto tablarize(O)( - string _txt, - const O obj, -) { - string[] _table_rows = (_txt).split(rgx.table_delimiter_row); - string[] _table_cols; - string _table; - string _tablenote; - foreach(row_idx, row; _table_rows) { - _table_cols = row.split(rgx.table_delimiter_col); - _table ~= ""; - foreach(col_idx, cell; _table_cols) { - if ((_table_cols.length == 1) - && (_table_rows.length <= row_idx+2)) { // check row_idx+2 (rather than == ++row_idx) - _tablenote ~= cell; - } else { - // // _table ~= "\\bfseries "; - // _table ~= cell; - // _table ~= (_table_cols.length > (col_idx + 1)) ? "&" : ""; - _table ~= format(q"┃%s%s┃", - cell, - (_table_cols.length > (col_idx + 1)) ? "&" : "" - ); - } - } - _table ~= "\\\\"; - } - auto t = tuple( - _table, - _tablenote, - ); - return t; -} -#+END_SRC - -***** table - -#+name: output_latex_shared_0 -#+BEGIN_SRC d -string table(O,M)( - string _txt, - O obj, - M doc_matters, -) { - if (obj.metainfo.is_a == "table") { - auto _t = _txt.tablarize(obj); - string _table = _t[0]; - string _t_n = _t[1]; - string papertype = "a4"; - uint pw = 0; - switch (papertype) { - case "a4": pw = (paper.a4.portrait.w - 20); break; - case "a5": pw = (paper.a5.portrait.w - 20); break; - case "b4": pw = (paper.b4.portrait.w - 20); break; - case "letter": pw = (paper.letter.portrait.w - 20); break; - case "legal": pw = (paper.legal.portrait.w - 20); break; - default: pw = 0; break; - } - // auto textwidth = (pw - 24); - string _colw = ""; - foreach (w; obj.table.column_widths) { - _colw ~= format(q"┃p{%.0fmm}┃", - (w * pw / 100) - // (w * (pw - 24)/ 100) - // (w * textwidth / 100) - ); - } - string _tex_para; - _tex_para = q"┃\begin{tiny}\hspace{0mm}\end{tiny}{\marginpar{\begin{tiny}\hspace{0mm}\hypertarget{%s}{%s}\end{tiny}}} -\setlength{\LTleft}{0pt} -\setlength{\LTright}{\fill} -\begin{tiny} -\begin{longtable}{%s} -%s -\end{longtable} -\end{tiny} -┃"; - _txt = format(_tex_para, - obj.metainfo.object_number, - obj.metainfo.object_number, - _colw, - _table, - ).strip; - } - return _txt; -} -#+END_SRC - -** latex parts -*** latex head :head: -**** latex head function - -#+name: output_latex_head -#+BEGIN_SRC d -string latex_head(M)( - M doc_matters, -) { -#+END_SRC - -**** latex head options -***** paper type dimensions -****** struct - -#+name: output_latex_head -#+BEGIN_SRC d - struct paperType { - string a4_portrait; - string a4_landscape; - string us_letter_portrait; - string us_letter_landscape; - } - auto paper = paperType(); -#+END_SRC - -****** footer - -#+name: output_latex_head -#+BEGIN_SRC d - string _footer(M)(M doc_matters) { - string _ft = "\\lfoot[\\textrm{\\thepage}]"; - string _ft_1 = format(q"┃{\tiny \href{%s}{%s}}┃", "http://sisudoc.org", "SiSU",); - string _ft_2 = format(q"┃ -\cfoot{\href{%s}{%s}}┃", "http://git.sisudoc.org", "git",); - if (doc_matters.conf_make_meta.make.footer.length > 0) { - if (doc_matters.conf_make_meta.make.footer.length > 0) { - if (doc_matters.conf_make_meta.make.footer[0].matchAll(rgx.inline_link)) { - _ft ~= doc_matters.conf_make_meta.make.footer[0] - .replace(rgx.inline_link, "{\\tiny \\href{$2}{$1}}"); - } else { - _ft ~= _ft_1; - } - } - if (doc_matters.conf_make_meta.make.footer.length > 1) { - if (doc_matters.conf_make_meta.make.footer[1].matchAll(rgx.inline_link)) { - _ft ~= doc_matters.conf_make_meta.make.footer[1] - .replace(rgx.inline_link, "\n\\cfoot{\\href{$2}{$1}}"); - } else { - _ft ~= _ft_2; - } - } - } else { - _ft ~= _ft_1; - _ft ~= _ft_2; - } - return _ft; - } -#+END_SRC - -****** a4, portrait - -#+name: output_latex_head_1_format_string -#+BEGIN_SRC d - paper.a4_portrait = format(q"┃ -#+END_SRC - -#+name: output_latex_head_1_tex -#+BEGIN_SRC latex -\documentclass[12pt,a4paper,titlepage]{scrartcl} -\setlength{\textheight}{228mm} \setlength{\textwidth}{160mm} -#+END_SRC - -#+name: output_latex_head_1_tex -#+BEGIN_SRC d -┃", - ); -#+END_SRC - -****** a4, landscape - -#+name: output_latex_head_1_tex -#+BEGIN_SRC d - paper.a4_landscape = format(q"┃ -#+END_SRC - -#+name: output_latex_head_1_tex -#+BEGIN_SRC latex -\documentclass[11pt,a4paper,landscape,titlepage,twocolumn]{scrartcl} -\setlength{\textheight}{160mm} \setlength{\textwidth}{238mm} -#+END_SRC - -#+name: output_latex_head_1_tex -#+BEGIN_SRC d -┃", - ); -#+END_SRC - -****** us letter, portrait - -#+name: output_latex_head_1_tex -#+BEGIN_SRC d - paper.us_letter_portrait = format(q"┃ -#+END_SRC - -#+name: output_latex_head_1_tex -#+BEGIN_SRC latex -\documentclass[12pt,letterpaper,titlepage]{scrartcl} -\setlength{\textheight}{212mm} \setlength{\textwidth}{166mm} -#+END_SRC - -#+name: output_latex_head_1_tex -#+BEGIN_SRC d -┃", - ); -#+END_SRC - -****** us letter, landscape - -#+name: output_latex_head_1_tex -#+BEGIN_SRC d - paper.us_letter_landscape = format(q"┃ -#+END_SRC - -#+name: output_latex_head_1_tex -#+BEGIN_SRC latex -\documentclass[11pt,letterpaper,landscape,titlepage,twocolumn]{scrartcl} -\setlength{\textheight}{166mm} \setlength{\textwidth}{226mm} -#+END_SRC - -#+name: output_latex_head_1_tex -#+BEGIN_SRC d -┃", - ); -#+END_SRC - -***** paper margins -****** struct - -#+name: output_latex_head_1_tex -#+BEGIN_SRC d - struct paperMargins { - string portrait; - string landscape; - } - auto margins = paperMargins(); -#+END_SRC - -****** portrait - -#+name: output_latex_head_1_tex -#+BEGIN_SRC d - margins.portrait = format(q"┃ -#+END_SRC - -#+name: output_latex_head_1_tex -#+BEGIN_SRC latex -\setlength{\oddsidemargin}{0mm} \setlength{\evensidemargin}{0mm} -\setlength{\topmargin}{-12pt} \setlength{\headheight}{12pt} -\setlength{\headsep}{35pt} -#+END_SRC - -#+name: output_latex_head_1_tex -#+BEGIN_SRC d -┃", - ); -#+END_SRC - -****** landscape - -#+name: output_latex_head_1_tex -#+BEGIN_SRC d - margins.landscape = format(q"┃ -#+END_SRC - -#+name: output_latex_head_1_tex -#+BEGIN_SRC latex -\setlength{\oddsidemargin}{6mm} \setlength{\evensidemargin}{6mm} -\setlength{\topmargin}{-12mm} \setlength{\headheight}{12pt} -\setlength{\headsep}{20pt} -#+END_SRC - -#+name: output_latex_head_1_tex -#+BEGIN_SRC d -┃", - ); -#+END_SRC - -***** multicol -****** struct - -#+name: output_latex_head_1_tex -#+BEGIN_SRC d - struct columnsMulti { - string portrait; - string landscape; - } - auto multicol = columnsMulti(); -#+END_SRC - -****** portrait - -#+name: output_latex_head_1_tex -#+BEGIN_SRC d - multicol.portrait = format(q"┃ -#+END_SRC - -#+name: output_latex_head_1_tex -#+BEGIN_SRC latex -\usepackage{multicol} -#+END_SRC - -#+name: output_latex_head_1_tex -#+BEGIN_SRC d -┃", - ); -#+END_SRC - -****** landscape - -#+name: output_latex_head_1_tex -#+BEGIN_SRC d - multicol.landscape = ""; -#+END_SRC - -***** color links -****** struct - -#+name: output_latex_head_1_tex -#+BEGIN_SRC d - struct colorLinks { - string mono; - string color; - } - auto links = colorLinks(); -#+END_SRC - -****** mono - -#+name: output_latex_head_1_tex -#+BEGIN_SRC d - links.mono = format(q"┃ -#+END_SRC - -#+name: output_latex_head_1_tex -#+BEGIN_SRC latex -\usepackage[xetex, - colorlinks=true, - urlcolor=myblack, - filecolor=myblack, - linkcolor=myblack, -#+END_SRC - -#+name: output_latex_head_1_tex -#+BEGIN_SRC d -┃", - ); -#+END_SRC - -****** color - -#+name: output_latex_head_1_tex -#+BEGIN_SRC d - links.color = format(q"┃ -#+END_SRC - -#+name: output_latex_head_1_tex -#+BEGIN_SRC latex -\usepackage[xetex, - colorlinks=true, - urlcolor=myblue, %% \href{...}{...} external url - filecolor=mygreen, %% \href{...} local file - linkcolor=myred, %% \href{...} and \pageref{...} -#+END_SRC - -#+name: output_latex_head_1_format_string_variables -#+BEGIN_SRC d -┃", - ); -#+END_SRC - -**** latex head starts - -#+name: output_latex_head_0_format_string -#+BEGIN_SRC d - string _latex_head = format(q"┃%%%% DocReform LaTeX output -#+END_SRC - -***** description comment - -#+name: output_latex_head_0_tex -#+BEGIN_SRC latex -%%%% Generated by: %s -%%%% D version: %s -%%%% LaTeX output last Generated on: %s -%%%% %s %s - -#+END_SRC - -***** paper type (a4, letter, ...; ( portrait | landscape )) - -- paper.a4_portrait -- paper.a4_landscape -- paper.us_letter_portrait -- paper.us_letter_landscape - -#+name: output_latex_head_0_tex -#+BEGIN_SRC latex -%s -#+END_SRC - -***** paper margins (portrait | landscape) - -- margins.portrait -- margins.landscape - -#+name: output_latex_head_0_tex -#+BEGIN_SRC latex -%s -#+END_SRC - -***** margin shared - -#+name: output_latex_head_0_tex -#+BEGIN_SRC latex -\setlength{\marginparsep}{4mm} -\setlength{\marginparwidth}{8mm} -#+END_SRC - -***** multicol (portrait | landscape) - -#+name: output_latex_head_0_tex -#+BEGIN_SRC latex -%s -#+END_SRC - -***** language & font - -#+name: output_latex_head_0_tex -#+BEGIN_SRC latex -\usepackage{polyglossia, ucs, fontspec, xltxtra, xunicode} -\setmainlanguage{%s} -\setotherlanguage{%s} -\setmainfont{Liberation Sans} -\setmonofont[Scale=0.85]{Liberation Mono} -#+END_SRC - -%% \setsansfont{Liberation Sans} -%% \setromanfont{Liberation Serif} - -***** latex head - -#+name: output_latex_head_0_tex -#+BEGIN_SRC latex -\usepackage{alltt} -\usepackage{thumbpdf} -#+END_SRC - -***** color links: no = mono | yes = color - -#+name: output_latex_head_0_tex -#+BEGIN_SRC latex -%s -#+END_SRC - -***** metadata - -#+name: output_latex_head_0_tex -#+BEGIN_SRC latex - pdftitle={%s}, - pdfauthor={%s}, - pdfsubject={%s}, - pdfkeywords={}, - pageanchor=true, - plainpages=true, - pdfpagelabels=true, - pagebackref, - bookmarks=true, - bookmarksopen=true, - pdfmenubar=true, - pdfpagemode=UseOutline, - pdffitwindow=true, - pdfwindowui=true, - plainpages=false, - pdfstartview=FitH -] -{hyperref} -#+END_SRC - -%% pdfusetitle=true, -%% pdfpagelayout=SinglePage, -%% pdfpagelayout=TwoColumnRight, -%% pdfpagelayout=TwoColumnLeft, -%% pdfstartpage=3, - -%%%% trace lost characters -%% \tracinglostchars = 1 -%% \tracingonline = 1 - -***** define colors - -#+name: output_latex_head_0_tex -#+BEGIN_SRC latex -\usepackage[usenames]{color} -\definecolor{myblack}{rgb}{0,0,0} -\definecolor{myred}{rgb}{0.75,0,0} -\definecolor{mygreen}{rgb}{0,0.5,0} -\definecolor{myblue}{rgb}{0,0,0.5} -\definecolor{mywhite}{rgb}{1,1,1} -#+END_SRC - -***** latex head - -#+name: output_latex_head_0_tex -#+BEGIN_SRC latex -\usepackage{url} -\urlstyle{sf} -#+END_SRC - -%%\usepackage{breakurl} - -***** latex head - -#+name: output_latex_head_0_tex -#+BEGIN_SRC latex -\usepackage{textcomp} -\usepackage[parfill]{parskip} -\usepackage[normalem]{ulem} -\usepackage{soul} -\usepackage{longtable} -\usepackage[tc]{titlepic} -\usepackage{graphicx} -\makeatletter -\parindent0pt -\usepackage{amssymb} -\usepackage{listings} -\usepackage{color} -\usepackage{textcomp} -\setcounter{secnumdepth}{2} -\setcounter{tocdepth}{4} -\makeatletter -#+END_SRC - -***** indent, bullet, list - -#+name: output_latex_head_0_tex -#+BEGIN_SRC latex -\usepackage[multiple,ragged]{footmisc} -\setlength\footnotemargin{12pt} -\usepackage[para]{manyfoot} -\DeclareNewFootnote{A} -\newenvironment{ParagraphIndent}[1]%% -{ -\begin{list}{}{%% -\setlength\topsep{0pt}%% -\addtolength{\leftmargin}{#1} -\setlength\parsep{0pt plus 1pt}%% -} -\item[] -} -{\end{list}} -\newenvironment{ParagraphHang}[2]%% -{ -\begin{list}{}{%% -\setlength\topsep{0pt}%% -\addtolength{\leftmargin}{#1} -\itemindent=#2 -\setlength\parsep{0pt plus 1pt}%% -} -\item[] -} -{\end{list}} -\newenvironment{Bullet}[1]%% -{ -\begin{list}{}{%% -\setlength\topsep{0pt}%% -\addtolength{\leftmargin}{#1} -\itemindent=-1em -\setlength\parsep{0pt plus 1pt}%% -} -\item[] -} -{\end{list}} -#+END_SRC - -%%\DeclareNewFootnote[para]{A} - -***** part, section, subsection, paragraph, subparagraph - -#+name: output_latex_head_0_tex -#+BEGIN_SRC latex -\usepackage{fancyhdr} -\lhead{} -\renewcommand{\part}{\@startsection - {part}{1}{-2mm}%% - {-\baselineskip}{0.5\baselineskip}%% - {\bfseries\large\upshape\raggedright}} -\renewcommand{\section}{\@startsection - {section}{2}{-2mm}%% - {-\baselineskip}{0.5\baselineskip}%% - {\bfseries\large\upshape\raggedright}} -\renewcommand{\subsection}{\@startsection - {subsection}{3}{-2mm}%% - {-\baselineskip}{0.5\baselineskip}%% - {\bfseries\large\upshape\raggedright}} -\renewcommand{\subsubsection}{\@startsection - {subsubsection}{4}{-2mm}%% - {-\baselineskip}{0.5\baselineskip}%% - {\normalfont\normalsize\bfseries\raggedright}} -\renewcommand{\paragraph}{\@startsection - {paragraph}{5}{-2mm}%% - {-\baselineskip}{0.5\baselineskip}%% - {\normalfont\normalsize\itshape\raggedright}} -\renewcommand{\subparagraph}{\@startsection - {subparagraph}%%{6}%%{-2mm}%% - {-\baselineskip}{0.5\baselineskip}%% - {\normalfont\normalsize\itshape\raggedright}} -#+END_SRC - -%% \makeatother - -***** latex head misc. including defined commands - -#+name: output_latex_head_0_tex -#+BEGIN_SRC latex -\selectlanguage{%s} -\lhead[ ]{ } -\chead[ \fancyplain{} \bfseries \footnotesize \leftmark ]{ \fancyplain{} \bfseries \footnotesize \rightmark } -\rhead[ ]{ } -%s -\rfoot[\tiny \href{}{}]{\textrm{\thepage}} -\tolerance=300 -\clubpenalty=300 -\widowpenalty=300 -\makeatother -\makeatother -\chardef\txtbullet="2022 -\chardef\tilde="7E -\def\asterisk{{\rm \char42} } -\definecolor{Light}{gray}{.92} -\newcommand{\Codeblock}[1]{\normaltext\raggedright\small\ttfamily\texbackslash#1} -\newcommand{\monosp}[1]{\normaltext\ttfamily\texbackslash#1} -\newcommand{\parasep}{\\ \begin{center}*\hspace{2em}*\hspace{2em}*\end{center} \\} -\newcommand{\hardspace}{{~}} -\newcommand{\caret}{{\^{~}}} -\newcommand{\pipe}{{\textbar}} -\newcommand{\curlyopen}{{} -\newcommand{\curlyclose}{}} -\newcommand{\lt}{{UseTextSymbol{OML}{<}}} -\newcommand{\gt}{{UseTextSymbol{OML}{>}}} -\newcommand{\slash}{{/}} -\newcommand{\underscore}{\_} -\newcommand{\exclaim}{\Verbatim{!}} -\definecolor{listinggray}{gray}{0.9} -\definecolor{lbcolor}{rgb}{0.9,0.9,0.9} -\lstset{ - backgroundcolor=\color{lbcolor}, - tabsize=4, - rulecolor=, - language=, - basicstyle=\scriptsize, - upquote=true, - aboveskip={1.5\baselineskip}, - columns=fixed, - showstringspaces=false, - extendedchars=true, - breaklines=true, - prebreak = \raisebox{0ex}[0ex][0ex]{\ensuremath{\hookleftarrow}}, - frame=single, - showtabs=false, - showspaces=false, - showstringspaces=false, - identifierstyle=\ttfamily, - keywordstyle=\color[rgb]{0,0,1}, - commentstyle=\color[rgb]{0.133,0.545,0.133}, - stringstyle=\color[rgb]{0.627,0.126,0.941}, -} -#+END_SRC - -%%\chardef\asterisk="2A -%%\newcommand{\hardspace}{\hspace{.5em}} - -**** latex head format inclusions - -#+name: output_latex_head_0_format_string_variables -#+BEGIN_SRC d -┃", - doc_matters.opt.action.debug_do ? "" : doc_matters.generator_program.name_and_version.strip, - doc_matters.opt.action.debug_do ? "" : doc_matters.generator_program.compiler.strip, - doc_matters.opt.action.debug_do ? "" : doc_matters.generator_program.stime.strip, - doc_matters.generator_program.project_name.strip, - doc_matters.generator_program.url_home.strip, - paper.a4_portrait.strip, - margins.portrait.strip, - multicol.portrait.strip, - lang.codes[doc_matters.src.language]["xlp"], - "english", - links.mono.strip, // links.color.strip, - doc_matters.conf_make_meta.meta.title_full.strip, - doc_matters.conf_make_meta.meta.creator_author.strip, - doc_matters.conf_make_meta.meta.classify_subject.strip, - lang.codes[doc_matters.src.language]["xlp"], - _footer(doc_matters), -); -#+END_SRC - -**** latex head return - -#+name: output_latex_head_close -#+BEGIN_SRC d - return _latex_head.strip; -} -#+END_SRC - -*** ↻ latex body :content:body: -**** latex body function - -#+name: output_latex_body -#+BEGIN_SRC d -string latex_body(D,M)( - const D doc_abstraction, - M doc_matters, -) { - string _latex_body = ""; - bool _multicolumns = false; - string _txt; -#+END_SRC - -**** ↻ loop open - -#+name: output_latex_body -#+BEGIN_SRC d - foreach (part; doc_matters.has.keys_seq.latex) { - foreach (obj; doc_abstraction[part]) { - switch (obj.metainfo.is_of_part) { -#+END_SRC - -**** ↻ within loop -***** frontmatter - -#+name: output_latex_body -#+BEGIN_SRC d - case "frontmatter": assert(part == "head" || "toc"); - _txt = obj.text - .sp_char_esc(obj) - .fontface; - switch (obj.metainfo.is_of_type) { - case "para": - switch (obj.metainfo.is_a) { - case "heading": - _txt = _txt.heading(obj, doc_matters); - goto default; - case "toc": - break; - default: - _latex_body ~= _txt ~ "\n\n"; - _txt = ""; - break; - } - break; - default: break; - } - break; -#+END_SRC - -***** body - -#+name: output_latex_body -#+BEGIN_SRC d - case "body": assert(part == "body" || "head"); // surprise - _txt = obj.text - .sp_char_esc(obj) - .fontface; - switch (obj.metainfo.is_of_type) { - case "para": - switch (obj.metainfo.is_a) { - case "heading": - _txt = _txt.heading(obj, doc_matters); - goto default; - case "para": - _txt = _txt.para(obj) - .bullets_and_indentation(obj) - .links_and_images(obj, doc_matters); - goto default; - default: - _latex_body ~= _txt ~ "\n\n"; - _txt = ""; - break; - } - break; - case "block": - switch (obj.metainfo.is_a) { - case "quote": - goto default; // TODO - case "group": - /+ (hardspaces not honored) [remove any hardspace marker] +/ - _txt = _txt.group(obj, doc_matters) - .links_and_images(obj, doc_matters); - goto default; - case "block": - /+ (hardspace honored) \hardspace +/ - _txt = _txt.block(obj, doc_matters) - .links_and_images(obj, doc_matters); - goto default; - case "verse": - /+ (hardspace honored) \hardspace +/ - _txt = _txt.verse(obj, doc_matters) - .links_and_images(obj, doc_matters); - goto default; - case "code": - /+ (hardspace honored) \begin{lstlisting} clear hardspace marker +/ - _txt = _txt.codeblock(obj, doc_matters); - goto default; - case "table": - _txt = _txt.table(obj, doc_matters); - goto default; // TODO - default: - _latex_body ~= _txt ~ "\n\n"; - _txt = ""; - break; - } - break; - default: break; - } - break; -#+END_SRC - -***** backmatter - -#+name: output_latex_body -#+BEGIN_SRC d - case "backmatter": - assert(part == "endnotes" || "glossary" || "bibliography" || "bookindex" || "blurb" || "tail"); - _txt = obj.text - .sp_char_esc(obj) - .fontface; - switch (obj.metainfo.is_of_type) { - case "para": - if (part != "bookindex" && _multicolumns) { - _multicolumns = false; - _latex_body ~= "\n\\end{multicols}\n"; - } - switch (obj.metainfo.is_a) { - case "heading": - if (part == "bookindex") { - _multicolumns = true; - } - _txt = _txt.heading(obj, doc_matters, part); - goto default; - case "endnote": assert(part == "endnotes"); - _txt = _txt.para(obj) - .bullets_and_indentation(obj) - .links_and_images(obj, doc_matters); - goto default; - case "glossary": assert(part == "glossary"); - _txt = _txt.para(obj) - .bullets_and_indentation(obj) - .links_and_images(obj, doc_matters); - goto default; - case "bibliography": assert(part == "bibliography"); - _txt = _txt.para(obj) - .bullets_and_indentation(obj); - goto default; - case "bookindex": assert(part == "bookindex"); - /+ two column, special section +/ - _txt = _txt.bookindex(obj) - .links_and_images(obj, doc_matters); - goto default; - case "blurb": assert(part == "blurb"); - _txt = _txt.para(obj) - .bullets_and_indentation(obj) - .links_and_images(obj, doc_matters); - goto default; - default: - _latex_body ~= (part == "bookindex" && obj.metainfo.is_a != "heading") - ? _txt : (_txt ~ "\n\n"); - _txt = ""; - break; - } - break; - default: break; - } - break; -#+END_SRC - -***** after - -#+name: output_latex_body -#+BEGIN_SRC d - case "comment": - break; - default: - { /+ debug +/ - if (doc_matters.opt.action.debug_do - && doc_matters.opt.action.verbose) { - writeln(__FILE__, ":", __LINE__, ": ", obj.metainfo.is_of_part); - writeln(__FILE__, ":", __LINE__, ": ", obj.metainfo.is_a); - writeln(__FILE__, ":", __LINE__, ": ", obj.text); - } - } - break; - } - } - } - if (_multicolumns) { - _multicolumns = false; - _latex_body ~= "\n\\end{multicols}\n"; - } -#+END_SRC - -**** latex body return - -#+name: output_latex_body -#+BEGIN_SRC d - return _latex_body; -} -#+END_SRC - -*** latex tail :tail: -**** latex tail function - -#+name: output_latex_tail -#+BEGIN_SRC d -string latex_tail(M)( - M doc_matters, -) { -#+END_SRC - -**** latex tail starts - -#+name: output_latex_tail -#+BEGIN_SRC d - string _latex_tail = format(q"┃ -#+END_SRC - -***** latex tail format inclusions - - -***** latex document end - -#+name: output_latex_tail_tex -#+BEGIN_SRC latex - -\end{document} -#+END_SRC - -**** latex tail format inclusions - -#+name: output_latex_tail_close -#+BEGIN_SRC d -┃", - // doc_matters.conf_make_meta.meta.title_full, - // doc_matters.conf_make_meta.meta.creator_author, -); -#+END_SRC - -**** latex tail return - -#+name: output_latex_tail_close -#+BEGIN_SRC d - return _latex_tail; -} -#+END_SRC - -* latex system command helper script -** latex command, ruby script - -#+BEGIN_SRC ruby :tangle "../util/dr_tex.rb" :tangle-mode (identity #o755) :shebang #!/usr/bin/env ruby -require 'fileutils' -pwd = Dir.pwd -argv,texfiles_with_path,flags=[],[],[] -lngs = %{(am|bg|bn|br|ca|cs|cy|da|de|el|en|eo|es|et|eu|fi|fr|ga|gl|he|hi|hr|hy|ia|is|it|ja|ko|la|lo|lt|lv|ml|mr|nl|no|nn|oc|pl|pt|pt_BR|ro|ru|sa|se|sk|sl|sq|sr|sv|ta|te|th|tk|tr|uk|ur|vi|zh)} -Regexp.new(lngs, Regexp::IGNORECASE) -argv=$* -argv.sort.each{|y| (y =~/^--\S+$/i) ? (flags << y) : (texfiles_with_path << y) } -if flags.length==0 \ -|| flags.inspect =~/"--help"/ - cmd=(/([^\/]+)$/).match($0)[1] - puts <<WOK -#{cmd} --help -#{cmd} --out=[output path] -#{cmd} --paper-size=a5 --out=~/test -WOK -end -paper_size = (flags.inspect.match(/"--paper-size=(a4|a5|b5|letter|legal)"/)) ? $1 : "a4" -out_path = Dir.pwd -if (flags.inspect.match(/"--out=\S+"/)) - out_path = flags.inspect.match(/"--out=(\S+)"/)[1] - unless (FileTest.directory?(out_path)) - puts "Creating output directory: --out=#{out_path}" - FileUtils::mkdir_p(out_path) - unless (FileTest.directory?(out_path)) - puts "FAILS unable to create directory: #{out_path}" - exit - end - end -end -if texfiles_with_path.length == 0 - texfiles_with_path=Dir.glob('*.tex') -end -if texfiles_with_path.length > 0 - texfiles_with_path.each do |texfile_with_path| - if texfile_with_path =~/.+\.tex/ - #puts texfile_with_path - if FileTest.file?(texfile_with_path) - file_basename_with_path = texfile_with_path.sub(/\.tex$/,'') - file_basename = file_basename_with_path.sub(/.*?([^\/]+)$/,'\1') - _out_path = out_path - if file_basename =~ /\.#{lngs}$/ - lng = file_basename.match(/\.#{lngs}$/)[1] - puts file_basename - puts lng - puts _out_path - unless _out_path.match(/\/#{lng}\/pdf$/) - _out_path = "#{out_path}/#{lng}/pdf" - FileUtils::mkdir_p(_out_path) - end - end - texpdf_cmd = %{xetex -interaction=batchmode -fmt=xelatex -papersize=#{paper_size} #{texfile_with_path}\n} - puts texpdf_cmd - 2.times { |i| system(texpdf_cmd) } - if (FileTest.file?(%{#{pwd}/#{file_basename}.pdf})) && (FileTest.directory?(_out_path)) - FileUtils::Verbose::mv(%{#{pwd}/#{file_basename}.pdf}, %{#{_out_path}/#{file_basename}.pdf}) - puts (%{#{_out_path}/#{file_basename}.pdf}) - else - puts "issue with pdf file or output directory" - puts "pdf file: #{pwd}/#{file_basename}.pdf}" - puts "output dir: #{_out_path}/" - end - suffix = ['log', 'out', 'toc', 'aux'] - suffix.each { |s| FileUtils::rm_f(%{#{pwd}/#{file_basename}.#{s}})} - end - end - end -end -Dir.chdir(pwd) -__END__ -#+END_SRC |