% Copyright 2019 by Till Tantau % % This file may be distributed and/or modified % % 1. under the LaTeX Project Public License and/or % 2. under the GNU Public License. % % See the file doc/generic/pgf/licenses/LICENSE for more details. \ProvidesFileRCS{pgfsys-tex4ht.def} % Driver commands for tex4ht % % Load common pdf commands: % \input pgfsys-common-svg.def % % tex4ht-specific stuff: % \def\pgfsys@invoke#1{\pgf@sys@fail{svg code in preamble}} \def\pgfsys@body@invoke#1{\HCode{#1}} \newcount\pgf@sys@svg@picnum \def\pgfsys@pictureboxsynced#1{% \pgfsys@beginscope\pgflowlevelsynccm\box#1\pgfsys@endscope% } %% %% initial support of Mathml and xhtml inside svg through the svg:foreignelement tag %% %% it'll allow us to have complicated text nodes in the tex4ht driver %% %Example (to improve the display, you have to use css) % %\tikzpicture[svg text only=false] %\draw (0,0) node[inner sep=0pt,draw] {tight} %(0cm,2em) node[inner sep=5pt,draw] {loose} %(0cm,4em) node[fill=red!20] {default}; %\draw (3,0) node[inner sep=0pt,draw] {TIGHT} %(3cm,2em) node[inner sep=5pt,draw] {LOOSE} %(3cm,4em) node[fill=red!20] {DEFAULT}; %\draw (6,0) node[inner sep=0pt,draw] {$tight$} %(6cm,2em) node[inner sep=5pt,draw] {$loose$} %(6cm,4em) node[fill=red!20] {$default$}; %\draw (9,0) node[inner sep=0pt,draw] {$TIGHT$} %(9cm,2em) node[inner sep=5pt,draw] {$LOOSE$} %(9cm,4em) node[fill=red!20] {$Default$}; %\endtikzpicture % % you can use the options "svg text css=filename", "svg text id=idname", "svg text class=classname" to customize the display through the use of css % %\def\pgfsys@beginpicture{% % % \Configure{[]}{$}{$} these two lines aren't needed for tex4ht and moreother they produce errors with plain tex ! % % \Configure{()}{$}{$} % \Configure{$$}{}{}{}%$$ % \Configure{$}{}{}{}%$ % \Configure{SUB}{\HCode{}}{\HCode{}} % \Configure{SUP}{\HCode{}}{\HCode{}} % \Configure{SUBSUP}{}{}{} % \Configure{htf} % {0}{+}{}{} %} %\def\pgfsys@endpicture{% % % undo: % \Configure{htf}{0}{+}{}{} %} \def\pgfsys@svg@newline{^^J} % we don't want tex4ht putting

and

tags automatically in our svg code and causing invalid xhtml in our svg pictures \newif\ifpgfsys@CssIncluded@\pgfsys@CssIncluded@false \def\pgfsys@beginpicture{% \pgfsys@svg@boxmodefalse% \EndP\HtmlParOff% \pgfkeys{/pgf/tex4ht node/escape=false}% % text only nodes are the default. Advantage : pure svg pictures are % the default, nicer for text only nodes. % Disadvantages : this rendering methods produce more invalid or degraded svg pictures than with the foreignelement tag %% we use css to control the display of foreignelement rendered text nodes \ifpgfsys@CssIncluded@ \else \Css{ .foreignobject {% line-height:100\%; font-size:120\%; % this is the trick....a font of size 100% in % a box scaled down to half size makes it a % half size font. % you'll have to double the size of things % that you want to have a regular size in % this half-scaled box though font-family:STIXgeneral,Times,Symbol,cmr10,CMSY10,CMEX10;% % can't wait for the stix font...the cmr10, etc font are % available from the mozilla site, times and symbols should be % okey padding:0; margin:0; % background-color:\#12ff55; usefull for debugging positioning text-align:center; % good for centered text nodes...will have to improve that later on...with more integration with pgf options for text nodes } }% \Css{% math {%, math[mode="inline"] { vertical-align:baseline; line-height:100\%; font-size:100\%; font-family:STIXGeneral,Times,Symbol, cmr10,cmsy10,cmex10,cmmi10; font-style: normal; margin:0; % background-color:\#99ff99; padding:0; }% }% \pgfsys@CssIncluded@true \fi }% \def\pgfsys@endpicture{% \HtmlParOn \par% FIXME : was '\Par' but that seems to be undefined!? }% % this is okay for both rendering methods for text nodes (mtext or foreignelement)... \def\pgfsys@typesetpicturebox#1{% \global\advance\pgf@sys@svg@picnum by 1\relax% % Ok, compute width/height \pgf@xa=\pgf@picminx% \pgf@ya=\pgf@picminy% \pgf@xb=\pgf@picmaxx% \pgf@yb=\pgf@picmaxy% \pgf@x=\pgf@xb% \advance\pgf@x by-\pgf@xa% \pgf@y=\pgf@yb% \advance\pgf@y by-\pgf@ya% \ifdim\pgf@y<1pt% \pgf@y=1pt% \fi% \pgf@xc=\pgf@x% \pgf@yc=\pgf@y% \pgfsysprotocol@flushcurrentprotocol% \HCode{

SVG-Viewer needed.

}% \special{t4ht>\jobname-\the\pgf@sys@svg@picnum.svg}% %%%%%%%% This is necessary to control the svg through css \pgfkeys{% /pgf/tex4ht node/css/.get=\pgfsys@foreignobject@css }% \pgfsys@invoke{\Hnewline% added that \Hnewline}% added that %%%%%%%%%%%%%%% maybee I should add an option to change the css, for the whole picture \pgfsys@invoke{\Hnewline \Hnewline }% % \pgf@ya=\pgf@shift@baseline\relax% \advance\pgf@ya by-\pgf@picminy\relax% % % \advance\pgf@picmaxy by-\pgf@picminy\relax% maxy is now the height \advance\pgf@picmaxx by-\pgf@picminx\relax% maxx is now the width \setbox#1=\hbox{\hskip-\pgf@picminx\lower\pgf@picminy\box#1}% \ht#1=\pgf@picmaxy% \wd#1=\pgf@picmaxx% \dp#1=0pt% \leavevmode \pgf@xa=\pgf@trimleft@final\relax \ifdim\pgf@xa=0pt \else\kern\pgf@xa\fi \raise-\pgf@ya\box#1% \pgf@xa=\pgf@trimright@final\relax \ifdim\pgf@xa=0pt \else\kern\pgf@xa\fi \pgfsys@invoke{\Hnewline \Hnewline }% \special{t4ht<\jobname-\the\pgf@sys@svg@picnum.svg}% }% %% we'll use this hbox for the mtext rendering method (the "text only=true" option) \def\pgfsys@hbox#1{% \pgf@x=.5\wd#1% \ifx\tikz@textcolor\relax\else\ifx\tikz@textcolor\@undefined\else% \ifx\tikz@textcolor\pgfutil@empty% \pgfsetfillcolor{.}% \else% \pgfsetfillcolor{\tikz@textcolor}% \fi% \fi\fi% tweak for TikZ \HCode{\Hnewline }% \wd#1=0pt% \ht#1=0pt% \dp#1=0pt% \box#1 \HCode{\Hnewline }% }% %% we save this definition \let\pgfsys@mtext@hbox\pgfsys@hbox %% we have to use some "evil" ^^ tex4ht hackery % tex4ht hackery {% grouping necessary cause we change the catcode of ":" \catcode`:=11\relax %%% this is necessary to calculate the size of text nodes with %%% inline maths % (it is an improvement of tex4ht, got to ask eitan gurary if he % could put it in the tex4ht code) \gdef\DviMathAlt{% \a:DviMath\leavevmode \MathClass \ht:special{t4ht@(}\hbox\bgroup{\expandafter\ifx\csname ht:everypar\endcsname\relax\expandafter\everypar\else \expandafter\ht:everypar\fi{}\leavevmode\ht:special{t4ht@)}}\DviSend }% % these are configures for the foreignelement rendering method of text nodes : we let tex4ht write xhtml and mathml in the svg picture % \gdef\pgfsys@foreignobject@configure{% \Configure{$}{\Configure{@math}{%\a:mathml display="inline" }\DviMathAlt}{\EndDviMath}{}%%% we REALLY need to use \DviMathAlt here instead of \DviMath see above remark \Configure{$$}{\Configure{@math}{%\a:mathml display="block" }\IgnorePar \ifvmode\else \HCode{}\fi\EndP \DviMath}{\EndDviMath\ShowPar\pgfsys@foreignobject@par{\csname HCondtrue\endcsname\noindent} }{\DisplayMathtrue}% \Configure{SUB}{\Send{BACK}{<\a:mathml msub><\a:mathml mrow\Hnewline>}% \Tg\Tg<\a:mathml mrow\Hnewline>\trap:base}{\Tg\TG}% \Configure{SUP}{\Send{BACK}{<\a:mathml msup><\a:mathml mrow\Hnewline>}% \Tg\Tg<\a:mathml mrow\Hnewline>\trap:base}{\Tg\TG}% \Configure{SUBSUP}{\Send{BACK}{<\a:mathml msubsup><\a:mathml mrow\Hnewline>}% \Tg\Tg<\a:mathml mrow\Hnewline>\trap:base}{\Tg\Tg<\a:mathml mrow\Hnewline>\trap:base}{\Tg\TG}% \Configure{htf}{0}{+}{}{}% }% \global\let\pgfsys@foreignobject@par=\par % use this instead of \par % -- \Configure is no \long macro (at % least in one of the older % versions). % these are the configures for the mtext rendering method of text % nodes : we turn everything into regular character (don't want math % modes or subsup) % and we hope it works (it doesn't if the text nodes aren't simple) \gdef\pgfsys@mtext@configure{% % no configures for \(\) and \[\] those might be needed for % context or Latex. Let me know ! \Configure{$$}{}{}{}% no block maths \Configure{$}{}{}{}%$ no inline maths \Configure{SUB}{\HCode{}}{\HCode{}}% \Configure{SUP}{\HCode{}}{\HCode{}}% \Configure{SUBSUP}{}{}{}% not both sub and sup \Configure{htf} {0}{+}{}{}% }% }% % a counter to produce unique ids for each text node rendered with foreign element \newcount\pgf@sys@svg@nodenum % pgfutil@minipage % % I had to change it to make it play nice with the way tex4ht puts

and <\p> tags % \newif\ifpgfsys@textonly \def\pgfutil@minipage[#1]#2{% \hbox to#2\bgroup \hsize=#2\relax \vbox\bgroup % though it works, I'm desabling the above-mentioned hack to make tex4ht behave with

<\p>, because it blurps the positioning % (I''l try to fix that later, it's a css thing) % % \ifpgfsys@textonly\else\HtmlParOn\fi % % \noindent is better as it doesn't produce indentation AND it makes you leave vertical mode \noindent%\leavevmode }% \def\pgfutil@endminipage{% % same thing here % % \ifpgfsys@textonly\else\EndP\HtmlParOff\fi \egroup\egroup }% % I'll have to fix those names later \newbox\pgfsys@foreignobject@Box \newdimen\pgf@s \newdimen\pgf@t % this is the alternate hbox routine that renders text nodes through the foreignobject tag \def\pgfsys@foreignobject@hbox#1{% % Compute box y translation (x translation is correct). \pgf@y=-\ht#1\relax \HCode{\Hnewline}% scaling work around (damn dumb browsers !) % Compute box size (scaled 2 times) % this is necessary to make the browser scale the font down 50% (the STUPID browsers won't make font-size:50% happen, % so we have to work around this by making svg scale the things down 50%, doubling the size of the text node frame (i.e. no changement there) \pgf@x=2\wd#1\relax \pgf@y=2\ht#1\relax \advance\pgf@y by 2\dp#1\relax % this is to adjust the y translation to compensate for the differences between the TeX and the Html models for lines \setbox\pgfsys@foreignobject@Box=\hbox{abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ $abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZf_1^1\overline D)_1^1\vec i\vec j$}% \pgf@t=\ht#1\relax \advance\pgf@t by -\ht\pgfsys@foreignobject@Box\relax \pgf@s=\pgf@t\relax \advance\pgf@s by \dp#1\relax \advance\pgf@s by -\dp\pgfsys@foreignobject@Box\relax \ifnum\pgf@s>0\relax \pgf@s=0pt \pgf@t=0pt \else \advance \pgf@y by -2\pgf@s\relax \pgf@t=2\pgf@t\relax \fi % \HCode{}% % this is to make use of the css, class and id options through which you can control the way things display \pgfkeys{% /pgf/tex4ht node/css/.get=\pgfsys@foreignobject@css,% /pgf/tex4ht node/class/.get=\pgfsys@foreignobject@class,% /pgf/tex4ht node/id/.get=\pgfsys@foreignobject@id }% \HCode{\Hnewline \Hnewline \Hnewline % I'll have to look into this, perhaps there are better % doctype....  aren't recognised and produces invalid svg % pictures a workaround (not implemented yet) would be to make % them into entities of the svg picture. \Hnewline

\Hnewline }% \box#1% \HCode{%
\Hnewline \Hnewline \Hnewline }% % debug positioning not needed but it would be nice to let it there to control things later on % \HCode{} \HCode{\Hnewline}% \global\advance\pgf@sys@svg@nodenum by 1\relax }% % the options and the code that controls it all (switches between \pgfsys@mtext@hbox and \pgfsys@foreignelement@hbox) \pgfkeys{% /pgf/.cd, tex4ht node/escape/.is choice, tex4ht node/escape/false/.code={\let\pgfsys@hbox\pgfsys@mtext@hbox\pgfsys@mtext@configure\pgfsys@textonlytrue}, tex4ht node/escape/true/.code={\let\pgfsys@hbox\pgfsys@foreignobject@hbox\pgfsys@foreignobject@configure\pgfsys@textonlyfalse}, tex4ht node/css/.initial=\jobname, tex4ht node/class/.initial=foreignobject, tex4ht node/id/.initial=\jobname\the\pgf@sys@svg@picnum-\the\pgf@sys@svg@nodenum }% % this might be needed %\font\SvgText=cmr10\relax % There is something rellay wrong with the way "%" chars are used in here... you should code "}%" to avoid unnecessary spaces % and it is unnecessary to code \cs% % got to be carefull with numbers though, cf the texbook...2\relax and 2 % are okey \def\pgfsys@outerinvoke{\ifpgfpicture\expandafter\pgfsys@invoke\else\expandafter\pgfutil@gobble\fi} \def\pgfsys@shadingoutsidepgfpicture#1{\pgf@sys@fail{svg code in preamble}} \def\pgfsys@shadinginsidepgfpicture#1{\pgf@sys@fail{svg code in preamble}} \def\pgfsys@body@shadingoutsidepgfpicture#1{% \begingroup% #1% \setbox\pgfpic=\hbox to0pt{% \pgfsys@beginpicture% \pgfsys@beginscope% \pgf@sys@svg@sh@defs% \pgf@sys@svg@sh% \pgfsys@endscope% \pgfsys@endpicture% \hss% }% \pgf@process{\pgf@sys@svg@pos}% \pgf@picminx=0pt% \pgf@picminy=0pt% \pgf@picmaxx=\pgf@x% \pgf@picmaxy=\pgf@y% \def\pgf@trimleft@final{0pt}% \def\pgf@trimright@final{0pt}% \def\pgf@shift@baseline{0pt}% \pgfsys@typesetpicturebox\pgfpic% \endgroup% } \def\pgfsys@body@shadinginsidepgfpicture#1{% #1% \pgf@sys@svg@sh@defs% hmmm.... \pgf@process{\pgf@sys@svg@pos} \pgf@xa=-.5\pgf@x% \pgf@ya=-.5\pgf@y% \pgfsysprotocol@literal{\Hnewline}% \pgf@sys@svg@sh% \pgfsysprotocol@literal{\Hnewline}% } \ifpgfutil@format@is@latex % Protect against color.4ht evil meddling with xcolor: \RequirePackage{xcolor} \let\pgf@xcolor@declaredcolor=\@declaredcolor \let\pgf@xcolor@undeclaredcolor=\@undeclaredcolor \fi \AtBeginDocument{ \let\pgfsys@invoke=\pgfsys@body@invoke \let\pgfsys@shadingoutsidepgfpicture=\pgfsys@body@shadingoutsidepgfpicture \let\pgfsys@shadinginsidepgfpicture=\pgfsys@body@shadinginsidepgfpicture \ifpgfutil@format@is@latex \let\pgf@texht@declaredcolor=\@declaredcolor \let\pgf@texht@undeclaredcolor=\@undeclaredcolor \def\@declaredcolor{\ifpgfpicture\expandafter\pgf@xcolor@declaredcolor\else\expandafter\pgf@texht@declaredcolor\fi} \def\@undeclaredcolor{\ifpgfpicture\expandafter\pgf@xcolor@undeclaredcolor\else\expandafter\pgf@texht@undeclaredcolor\fi} \fi \def\pgfutil@color{\pgfsetcolor} % \ConfigureEnv{pgfpicture}{}{}{}{} there is no environment in plain TeX and this produces errors % this might be needed for context or latex though....let me know ! }% \endinput %%% Local Variables: %%% mode: latex %%% End: