diff options
Diffstat (limited to 'graphics/pgf/base/tex/generic/systemlayer/pgfsys-tex4ht.def')
-rw-r--r-- | graphics/pgf/base/tex/generic/systemlayer/pgfsys-tex4ht.def | 487 |
1 files changed, 487 insertions, 0 deletions
diff --git a/graphics/pgf/base/tex/generic/systemlayer/pgfsys-tex4ht.def b/graphics/pgf/base/tex/generic/systemlayer/pgfsys-tex4ht.def new file mode 100644 index 0000000000..44dd1ae5b0 --- /dev/null +++ b/graphics/pgf/base/tex/generic/systemlayer/pgfsys-tex4ht.def @@ -0,0 +1,487 @@ +% 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{<tspan baseline-shift="sub">}}{\HCode{</tspan>}} +% \Configure{SUP}{\HCode{<tspan baseline-shift="sub">}}{\HCode{</tspan>}} +% \Configure{SUBSUP}{}{}{} +% \Configure{htf} +% {0}{+}{<tspan font-family="} +% {\%s}{" font-size="\%s}{}{} +% {">}{</tspan>} +%} + + + +%\def\pgfsys@endpicture{% +% % undo: +% \Configure{htf}{0}{+}{<span\Hnewline +% class="}{\%s}{-\%s}{x-x-\%d}{}{">}{</span>} +%} + +\def\pgfsys@svg@newline{^^J} + +% we don't want tex4ht putting <p> and </p> 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{<object data="\jobname-\the\pgf@sys@svg@picnum.svg" width="}% + % Calculate pixel coordinates (this does not really make sense, but + % we have to do it anyway). Assume 96dpi. + \pgf@x=1.3333333\pgf@x% + \pgf@y=1.3333333\pgf@y% + % Add one pixel for security: + \advance\pgf@x by1pt% + \advance\pgf@y by1pt% + \pgf@sys@pt\pgf@x% + \pgfsysprotocol@flushcurrentprotocol% + \pgfsys@invoke{" height="}% + \pgf@sys@pt\pgf@y% + \pgfsysprotocol@flushcurrentprotocol% + \pgfsys@invoke{" type="image/svg+xml"><p>SVG-Viewer needed.</p></object>}% + \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{<?xml version="1.0" encoding="iso-8859-1" standalone="no"?>\Hnewline% added that + <?xml-stylesheet href="\pgfsys@foreignobject@css.css" type="text/css"?>\Hnewline}% added that +%%%%%%%%%%%%%%% maybee I should add an option to change the css, for the whole picture + \pgfsys@invoke{<svg xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" width="\the\pgf@xc" + height="\the\pgf@yc" viewBox="}% + \pgf@sys@pt{\pgf@xa}\pgf@sys@pt{\pgf@ya}\pgf@sys@pt{\pgf@xc}\pgf@sys@pt{\pgf@yc}% + \pgfsysprotocol@flushcurrentprotocol% + \pgf@ya=-\pgf@ya% + \pgfsys@invoke{">\Hnewline <g transform="translate(0,} + \pgf@sys@pt\pgf@yb\pgfsysprotocol@flushcurrentprotocol% + \pgfsys@invoke{) scale(1,-1) translate(0,}% + \pgf@sys@pt\pgf@ya\pgfsysprotocol@flushcurrentprotocol% + \pgfsys@invoke{)">\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{</g>\Hnewline </svg>\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{<text + style="stroke:none" + transform="scale(1,-1) translate(\pgf@sys@tonumber{\pgf@x},0)" + text-anchor="middle" + }% + \ifpgfutil@format@is@latex% + \ifx\f@size\pgfutil@empty% + \else% + \HCode{ font-size="\f@size"}% + \fi% + \fi% + \HCode{>\Hnewline }% + \wd#1=0pt% + \ht#1=0pt% + \dp#1=0pt% + \box#1 + \HCode{</text>\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{<!--tex4ht:inline-->}\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</\a:mathml mrow>\Tg<\a:mathml mrow\Hnewline>\trap:base}{\Tg</\a:mathml mrow>\TG</\a:mathml msub\Hnewline>}% + \Configure{SUP}{\Send{BACK}{<\a:mathml msup><\a:mathml mrow\Hnewline>}% + \Tg</\a:mathml mrow>\Tg<\a:mathml mrow\Hnewline>\trap:base}{\Tg</\a:mathml mrow>\TG</\a:mathml msup\Hnewline>}% + \Configure{SUBSUP}{\Send{BACK}{<\a:mathml msubsup><\a:mathml mrow\Hnewline>}% + \Tg</\a:mathml mrow>\Tg<\a:mathml mrow\Hnewline>\trap:base}{\Tg</\a:mathml mrow>\Tg<\a:mathml mrow\Hnewline>\trap:base}{\Tg</\a:mathml mrow>\TG</\a:mathml msubsup\Hnewline>}% + \Configure{htf}{0}{+}{<span\Hnewline + class="}{\%s}{-\%s}{x-x-\%d}{}{">}{</span>}% + }% + \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{<tspan baseline-shift="sub">}}{\HCode{</tspan>}}% + \Configure{SUP}{\HCode{<tspan baseline-shift="sub">}}{\HCode{</tspan>}}% + \Configure{SUBSUP}{}{}{}% not both sub and sup + \Configure{htf} {0}{+}{<tspan font-family="}{\%s}{" font-size="\%s}{}{}{">}{</tspan>}% + }% +}% + +% 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 <p> 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> <\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{<g transform="scale(1,-1) translate(0,\pgf@sys@tonumber{\pgf@y}) % got to translate in y + scale(0.5,0.5)">\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{<foreignObject x="0" y="\pgf@sys@tonumber{\pgf@t}" + width="\pgf@sys@tonumber{\pgf@x}" height="\pgf@sys@tonumber{\pgf@y}">}% + % 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{<head>\Hnewline + <link rel="stylesheet" type="text/css" href="\pgfsys@foreignobject@css.css" />\Hnewline + </head>\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. + <body id="\pgfsys@foreignobject@id" class="\pgfsys@foreignobject@class" xmlns="http://www.w3.org/1999/xhtml" >\Hnewline + <div>\Hnewline + }% + \box#1% + \HCode{% + </div>\Hnewline + </body>\Hnewline + </foreignObject>\Hnewline + }% + % debug positioning not needed but it would be nice to let it there to control things later on + % \HCode{<rect x="0" y="0" width="\pgf@sys@tonumber{\pgf@x}" height="\pgf@sys@tonumber{\pgf@y}" + % style="fill:yellow;stroke:red; fill-opacity:0.5;stroke-opacity:0.5"/>} + \HCode{</g>\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{<g transform="translate(\pgf@sys@tonumber{\pgf@xa},\pgf@sys@tonumber{\pgf@ya})">\Hnewline}% + \pgf@sys@svg@sh% + \pgfsysprotocol@literal{</g>\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: |