diff options
author | Ralph Amissah <ralph.amissah@gmail.com> | 2022-03-24 12:38:41 -0400 |
---|---|---|
committer | Ralph Amissah <ralph.amissah@gmail.com> | 2022-04-03 18:13:50 -0400 |
commit | e2424c06d3bfa552f35fb288429c3ef4e5357cc7 (patch) | |
tree | c1d8aefd2ce9acc7760a4eb9dbef1eea3afa3c66 /src/doc_reform/io_out/latex.d | |
parent | latex, pagebreaks, make headers, consider (diff) |
latex output (try tidy); linebreaks more generally
Diffstat (limited to 'src/doc_reform/io_out/latex.d')
-rw-r--r-- | src/doc_reform/io_out/latex.d | 176 |
1 files changed, 113 insertions, 63 deletions
diff --git a/src/doc_reform/io_out/latex.d b/src/doc_reform/io_out/latex.d index e70c315..ca809d5 100644 --- a/src/doc_reform/io_out/latex.d +++ b/src/doc_reform/io_out/latex.d @@ -384,7 +384,7 @@ template outputLaTeX() { ) { string hardspaces(string _spaces) { _spaces = _spaces - .replaceAll(rgx.space, "\\hardspace "); + .replaceAll(rgx.space, "{\\s}"); return _spaces; } _txt = replaceAll!(m => hardspaces(m[0]))(_txt, rgx.spaces_line_start); @@ -392,7 +392,25 @@ template outputLaTeX() { } @safe string nbsp_char()(string _txt) { if (_txt.match(rgx.nbsp_char)) { - _txt = _txt.replaceAll(rgx.nbsp_char, "\\hardspace "); + foreach (m; _txt.matchAll(rgx.nbsp_chars)) { + int spaces_ = 0; + foreach (n; m[0].matchAll(rgx.nbsp_char)) { + spaces_ ++; + } + _txt = _txt.replaceFirst(rgx.nbsp_chars, "\\spaces{" ~ spaces_.to!string ~ "}"); + } + } + return _txt; + } + @safe string spaces_to_nbsp()(string _txt) { + if (_txt.match(rgx.spaces_keep)) { + foreach (m; _txt.matchAll(rgx.spaces_keep)) { + int spaces_ = 0; + foreach (n; m[0].matchAll(rgx.space)) { + spaces_ ++; + } + _txt = _txt.replaceFirst(rgx.spaces_keep, "\\spaces{" ~ spaces_.to!string ~ "}"); + } } return _txt; } @@ -440,9 +458,9 @@ template outputLaTeX() { ((m[1] == m[2]) && (m[2].match(rgx.uri))) // url link (regular link with url) ? format(q"┃\linkurl{%s}{%s}┃", _check_link(m[1]), (_check_link(m[1])).sp_char_esc_txt) : ((m[2].match(rgx.uri)) && (m[1].match(rgx.inline_image_info))) // linked image - ? format(q"┃%s\href{%s}%s{%s}┃", "\\br\n", _check_link(m[2]), "\n", _if_images(m[1])) // markup for images + ? format(q"┃%s\href{%s}%s{%s}┃", "\\br ", _check_link(m[2]), "\n", _if_images(m[1])) // markup for images : (m[2].match(rgx.uri)) // not linked image - ? format(q"┃%s\linktext{%s}{%s}┃", "\\br\n", _check_link(m[2]), m[1]) // regular link with text + ? format(q"┃%s\linktext{%s}{%s}┃", "\\br ", _check_link(m[2]), m[1]) // regular link with text : format(q"┃\hyperlink{%s}{%s}┃", _check_link(m[2]), _if_images(m[1])) // internal links, like book index )(_txt, rgx.inline_link); } @@ -455,7 +473,7 @@ template outputLaTeX() { 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, + _txt = _txt.split(rgx.br_linebreaks).join("\\br ").replaceAll(rgx.inline_notes_al_regular_number_note, format(_tex_note, "$1", "$1", "$1", "$2".strip @@ -496,7 +514,7 @@ template outputLaTeX() { string _tex_para; _tex_para = q"┃%s┃"; _txt = format(_tex_para, - _txt.replaceAll(rgx.latex_clean_bookindex_linebreak, "\n") ~ "\n\\br\n" + _txt.replaceAll(rgx.latex_clean_bookindex_linebreak, "\n") ~ "\n\\brln\n" ); } return _txt; @@ -705,7 +723,6 @@ template outputLaTeX() { \pagenumbering{arabic} \setcounter{page}{1} \markboth{ }{ } -\setlength{\parskip}{1ex plus0.5ex minus0.2ex} \part*{\ocn{1}%s \newline %s} \clearpage @@ -776,14 +793,14 @@ string group(O,M)( ) { if (obj.metainfo.is_a == "group") { string _tex_para; - _tex_para = q"┃\ocn{%s}\setlength{\parskip}{0.5ex plus0.2ex minus0.1ex} -\begin{footnotesize} + _tex_para = q"┃\ocn{%s}\objGroupOpen %s -\end{footnotesize} +\objGroupClose ┃"; _txt = format(_tex_para, obj.metainfo.object_number, - _txt.footnotes.strip + _txt.footnotes.split(rgx.br_line_spaced).join("\\brl{1}").strip // provides more control (more noise, not as tidy) + // _txt.footnotes.split(rgx.br_line_spaced).join("") // this works using a line-space, looks tidy, keep ref. ).strip; } return _txt; @@ -794,19 +811,14 @@ string block(O,M)( M doc_matters, ) { if (obj.metainfo.is_a == "block") { - // _txt = _txt.nbsp_char; string _tex_para; - _tex_para = q"┃\ocn{%s}\setlength{\parskip}{0.5ex plus0.2ex minus0.1ex} -\begin{footnotesize} + _tex_para = q"┃\ocn{%s}\objBlockOpen %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, +\objBlockClose +┃"; + _txt = format(_tex_para, obj.metainfo.object_number, - _txt.nbsp_char.footnotes.strip + _txt.nbsp_char.footnotes.split(rgx.br_linebreaks_newlines).join("\\br\n").strip ).strip; } return _txt; @@ -818,18 +830,13 @@ string verse(O,M)( ) { if (obj.metainfo.is_a == "verse") { string _tex_para; - _tex_para = q"┃\ocn{%s}\setlength{\parskip}{0.1ex plus0.1ex minus0.1ex} -\begin{footnotesize} - + _tex_para = q"┃\ocn{%s}\objPoemVerseOpen %s - -\end{footnotesize} -\setlength{\parskip}{1ex plus0.5ex minus0.2ex} -\linebreak -┃"; // \hardspace +\objPoemVerseClose +┃"; _txt = format(_tex_para, obj.metainfo.object_number, - _txt.nbsp_char.footnotes.split("\n").join("\n\n").strip + _txt.spaces_to_nbsp.footnotes.split(rgx.br_linebreaks_newlines).join("\\br\n").strip ).strip; } return _txt; @@ -841,12 +848,9 @@ string codeblock(O,M)( ) { if (obj.metainfo.is_a == "code") { string _tex_para; - _tex_para = q"┃\ocn{%s}\setlength{\parskip}{0.5ex plus0.2ex minus0.1ex}\begin{Codeblock} -\begin{lstlisting} + _tex_para = q"┃\ocn{%s}\begin{objCodeBlock}\begin{lstlisting} %s -\end{lstlisting} -\end{Codeblock} -\setlength{\parskip}{1ex plus0.5ex minus0.2ex} +\end{lstlisting}\end{objCodeBlock} ┃"; _txt = format(_tex_para, obj.metainfo.object_number, @@ -922,14 +926,9 @@ string table(O,M)( ); } string _tex_para; - _tex_para = q"┃\ocn{%s} -\setlength{\LTleft}{0pt} -\setlength{\LTright}{\fill} -\begin{tiny} -\begin{longtable}{%s} + _tex_para = q"┃\ocn{%s}\objTableOpen{%s} %s -\end{longtable} -\end{tiny} +\objTableClose ┃"; _txt = format(_tex_para, obj.metainfo.object_number, @@ -950,7 +949,7 @@ string table(O,M)( 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}┃", + _txt = format(q"┃\begin{Bullet}{%smm}%s\end{Bullet}┃", _indent, _txt.footnotes ).strip; @@ -973,7 +972,7 @@ string table(O,M)( _tex_para = q"┃\begin{ParagraphHang}{%smm}{%smm}%s \end{ParagraphHang}┃"; _txt = format(_tex_para, _indent, _hang, - _txt.footnotes + _txt.footnotes.split(rgx.br_linebreaks_newlines).join("\\br\n") ).strip; } return _txt; @@ -1188,7 +1187,7 @@ string table(O,M)( \usepackage[tc]{titlepic} \usepackage{graphicx} \makeatletter -\parindent0pt +\parindent{0pt} \usepackage{amssymb} \usepackage{listings} \usepackage{color} @@ -1230,6 +1229,7 @@ string table(O,M)( \setlength\parsep{0pt plus 1pt}%% } \item[] +$\txtbullet$\hspace{\enspace} } {\end{list}} \usepackage{fancyhdr} @@ -1249,16 +1249,52 @@ string table(O,M)( \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{\br}{\hfill\break} +\newcommand{\brl}[1]{%% + \ifx&%% + \hfill\break + \else + \vspace{#1ex} + \fi +} +\newcommand{\brln}{\hspace*{\fill}\linebreak} +\newcomand{\objBlockOpen}{ + \setlength{\parskip}{0.5ex plus0.2ex minus0.1ex}\raggedright + \begin{footnotesize} +} +\newcomand{\objBlockClose}{%% + \end{footnotesize} + \setlength{\parskip}{1ex plus0.5ex minus0.2ex} +} +\newcomand{\objGroupOpen}{%% + \setlength{\parskip}{0.5ex plus0.2ex minus0.1ex} + \begin{footnotesize} +} +\newcomand{\objGroupClose}{%% + \end{footnotesize} +} +\newcommand{\objPoemVerseOpen}{%% + \setlength{\parskip}{0.1ex plus0.1ex minus0.1ex} + \begin{footnotesize} + +} +\newcommand{\objPoemVerseClose}{%% + + \end{footnotesize} + \setlength{\parskip}{1ex plus0.5ex minus0.2ex} + \linebreak +} \newcommand{\parasep}{\smallskip \begin{center}*\hspace{2em}*\hspace{2em}*\end{center} \br} -\newcommand{\br}{\hspace*{\fill}} -\newcommand{\brln}{\smallskip} -\newcommand{\hardspace}{{~}} +\newcommand{\spaces}[1]{{\hspace*{#1ex}}} +\newcommand{\s}{\hspace*{1ex}} +\newcommand{\hardspace}{\hspace*{1ex}} +\newcommand{\-}{\hspace*{1ex}} +\newcommand{\..}{\hspace*{1ex}} %% dots trailing \newcommand{\caret}{{\^{~}}} \newcommand{\pipe}{{\textbar}} -\newcommand{\curlyopen}{{} -\newcommand{\curlyclose}{}} +\newcommand{\curlyOpen}{{} +\newcommand{\curlyClose}{}} \newcommand{\lt}{{UseTextSymbol{OML}{<}}} \newcommand{\gt}{{UseTextSymbol{OML}{>}}} \newcommand{\slash}{{/}} @@ -1270,18 +1306,27 @@ string table(O,M)( {\scriptsize\ttfamily\ulcorner\textup{{#2}}\lrcorner}}} \newcommand{\link}[2]{{\begin{scriptsize}\color{black}\urlstyle{tt}\href{#1} {\ulcorner{#2}\lrcorner}\end{scriptsize}}} +\newcommand{\objCodeBlock}[1]{\normaltext\raggedright\small\ttfamily\texbackslash#1} +\newcommand{\objCodeOpen}{\normaltext\raggedright\small\ttfamily\texbackslash +\begin{lstlisting} +} +\newcommand{\objCodeClose}{ +\end{lstlisting} +} \newcommand{\ocn}[1]{%% + \setlength{\parindent}{0em} \ifx&%% %% #1 is empty - \begin{tiny}\hspace{0mm}\end{tiny}{\marginpar{\begin{tiny}\end{tiny}}} + \hspace{-0.5ex}{\marginpar{\begin{tiny}\end{tiny}}} \else %% #1 is nonempty - \begin{tiny}\hspace{0mm}\end{tiny}{\marginpar{\begin{tiny}\hspace{0mm}\hypertarget{#1}{#1}\end{tiny}}} + \hspace{-0.5ex}{\marginpar{\begin{tiny}\hspace{0em}\hypertarget{#1}{#1}\end{tiny}}} \fi } \newcommand{\ocnhold}[1]{ \begin{tiny}\hspace{0mm}\end{tiny}{\marginpar{\begin{tiny}\hspace{0mm}\hypertarget{#1}{#1}\end{tiny}}} } +\newcommand{\objCodeBlockHold}[1]{\normaltext\raggedright\small\ttfamily\texbackslash#1} \definecolor{listinggray}{gray}{0.9} \definecolor{lbcolor}{rgb}{0.9,0.9,0.9} \lstset{ @@ -1289,9 +1334,8 @@ string table(O,M)( tabsize=4, rulecolor=, language=, - basicstyle=\scriptsize, + basicstyle={\ttfamily\scriptsize}, upquote=true, - aboveskip={1.5\baselineskip}, columns=fixed, showstringspaces=false, extendedchars=true, @@ -1306,6 +1350,16 @@ string table(O,M)( commentstyle=\color[rgb]{0.133,0.545,0.133}, stringstyle=\color[rgb]{0.627,0.126,0.941}, } +\newcommand{\objTableOpen}[1]{ +\setlength{\LTleft}{0pt} +\setlength{\LTright}{\fill} +\begin{tiny} +\begin{longtable}{#1} +} +\newcommand{\objTableClose}{ +\end{longtable} +\end{tiny} +} ┃", doc_matters.opt.action.debug_do_latex ? "" : doc_matters.generator_program.name_and_version.strip, doc_matters.opt.action.debug_do_latex ? "" : doc_matters.generator_program.compiler.strip, @@ -1383,23 +1437,19 @@ string table(O,M)( switch (obj.metainfo.is_a) { case "quote": goto default; // TODO - case "group": - /+ (hardspaces not honored) [remove any hardspace marker] +/ + 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 +/ + case "block": /+ (hardspace honored) \hardspace +/ _txt = _txt.block(obj, doc_matters) .links_and_images(obj, doc_matters); goto default; - case "verse": - /+ (hardspace honored) \hardspace +/ + 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 +/ + case "code": /+ (hardspace honored) \begin{lstlisting} clear hardspace marker +/ _txt = _txt.codeblock(obj, doc_matters); goto default; case "table": |