summaryrefslogtreecommitdiff
path: root/tex/context/base/grph-inc.mkiv
diff options
context:
space:
mode:
Diffstat (limited to 'tex/context/base/grph-inc.mkiv')
-rw-r--r--tex/context/base/grph-inc.mkiv302
1 files changed, 187 insertions, 115 deletions
diff --git a/tex/context/base/grph-inc.mkiv b/tex/context/base/grph-inc.mkiv
index cc3989491..32fba6c04 100644
--- a/tex/context/base/grph-inc.mkiv
+++ b/tex/context/base/grph-inc.mkiv
@@ -11,6 +11,8 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
+% todo: messages
+
\writestatus{loading}{ConTeXt Graphic Macros / Figure Inclusion}
\registerctxluafile{grph-inc}{1.001}
@@ -30,11 +32,13 @@
\ifdefined\dotagfigure \else \let\dotagfigure\relax \fi
-\installcorenamespace{externalfigures}
+\installcorenamespace{externalfigure}
\installcorenamespace{externalfigureinstance}
\installcorenamespace{externalfigurecollection}
-\installframedcommandhandler \??externalfigures {externalfigures} \??externalfigures
+\installframedcommandhandler \??externalfigure {externalfigure} \??externalfigure
+
+\let\setupexternalfigures\setupexternalfigure
\setupexternalfigures[% we really need the defaults
\c!method =,
@@ -60,8 +64,8 @@
\c!hfactor =,
\c!wfactor =,
\c!factor =,
- \c!maxwidth =\externalfiguresparameter\c!width,
- \c!maxheight =\externalfiguresparameter\c!height,
+ \c!maxwidth =\externalfigureparameter\c!width,
+ \c!maxheight =\externalfigureparameter\c!height,
\c!xscale =,
\c!yscale =,
\c!scale =,
@@ -137,93 +141,179 @@
%
% \defineexternalfigure[name][settings]
-\unexpanded\def\defineexternalfigure
- {\dodoubleargument\grph_include_define}
+%D Defining is persistent, i.e.\ when you redefine an instance,
+%D the already set parameters need to be set again or otherwise
+%D the old values will be used.
+
+\newconditional\c_grph_include_trace_inheritance
+
+\installtextracker
+ {graphics.inheritance}
+ {\settrue \c_grph_include_trace_inheritance}
+ {\setfalse\c_grph_include_trace_inheritance}
+
+\installcorenamespace{externalfiguredefinition}
+
+% \unexpanded\def\defineexternalfigure
+% {\dodoubleargument\grph_include_define}
+%
+% \def\grph_include_define[#1][#2]%
+% {\setvalue{\??externalfiguredefinition#1}{\setupcurrentexternalfigure[#2]}}
-\def\grph_include_define[#1][#2]%
- {\setvalue{\??externalfigureinstance#1}{\grph_include_use[#1][][][#2]}}
+\let\defineexternalfigures\defineexternalfigure
-\def\useexternalfigure
+\unexpanded\def\useexternalfigure
{\doquadrupleempty\grph_include_use}
+% label file parent settings
+% label file settings
+% label file parent
+
\def\grph_include_use[#1][#2][#3][#4]%
{\doifelsenothing{#1}
{\doifsomething{#2}
{\doifassignmentelse{#3}
{\grph_include_use_indeed{#2}{#2}{#3}{#4}}
- {\grph_include_use_indeed{#2}{#2}{}{#4}}}}
+ {\grph_include_use_indeed{#2}{#2}\empty{#4}}}}
{\doifelsenothing{#2}
{\doifassignmentelse{#3}
- {\grph_include_use_indeed{#1}{#1}{}{#3}}
+ {\grph_include_use_indeed{#1}{#1}\empty{#3}}
{\grph_include_use_indeed{#1}{#1}{#3}{#4}}}
{\doifassignmentelse{#3}
- {\grph_include_use_indeed{#1}{#2}{}{#3}}
+ {\grph_include_use_indeed{#1}{#2}\empty{#3}}
{\grph_include_use_indeed{#1}{#2}{#3}{#4}}}}}
\def\grph_include_use_indeed#1#2#3#4%
- {\setvalue{\??externalfigureinstance#1}{\grph_include_place[#1][#2][#3][#4]}%
+ {\setvalue{\??externalfigureinstance#1}{\grph_include_setup{#2}{#3}{#4}}%
\grph_include_analyze_collection[#2][#4]}
-\def\grph_include_place[#1][#2][#3][#4][#5]%
- {\doifsomething{#2}% catches \defineexternalfigure dummies
- {\ifcsname\??externalfigureinstance#2\endcsname
- \doifelse{#1}{#2}
- {\grph_include_place_indeed[#1][#2][#3][#4][#5]}
- {\csname\??externalfigureinstance#2\endcsname[#5]}%
- \else
- \grph_include_place_indeed[#1][#2][#3][#4][#5]%
- \fi}}
+% inclusion
-\def\grph_include_place_indeed[#1][#2][#3][#4][#5]%
- {\bgroup
- \advance\c_grph_include_nesting\plusone
- \edef\currentexternalfigures{\the\c_grph_include_nesting}%
- \checkexternalfiguresparent % each inherits from the root
- %
- \dostarttagged\t!image\empty
- %
+\unexpanded\def\externalfigure
+ {\dotripleempty\grph_include_figure}
+
+\def\grph_include_figure[#1][#2][#3]%
+ {\docheckassignment{#2}%
+ \ifassignment
+ \grph_include_place[#1][][#2]%
+ \else
+ \grph_include_place[#1][#2][#3]%
+ \fi}
+
+% todo: chain them
+
+\def\grph_include_setup#1#2#3% name parent settings
+ {\edef\m_grph_include_name {#1}%
+ \edef\m_grph_include_parent{#2}%
+ \ifx\m_grph_include_name\empty \else
+ \let\p_grph_include_name\m_grph_include_name
+ \fi
+ \ifx\m_grph_include_parent\empty \else
+ \grph_include_inherit_from_parent\m_grph_include_parent
+ \fi
+ \setupcurrentexternalfigure[#3]}
+
+% \def\grph_include_inherit_from_parent#1%
+% {\ifcsname\??externalfiguredefinition#1\endcsname
+% \ifconditional\c_grph_include_trace_inheritance\c_grph_include_trace_inheritance\writestatus\m!figures{inheriting from definition: #1}\fi
+% \csname\??externalfiguredefinition#1\endcsname
+% \fi
+% \ifcsname\??externalfigureinstance#1\endcsname
+% \ifconditional\c_grph_include_trace_inheritance\c_grph_include_trace_inheritance\writestatus\m!figures{inheriting from instance: #1}\fi
+% \csname\??externalfigureinstance#1\endcsname
+% \fi}
+
+\def\grph_include_inherit_from_parent#1%
+ {%\ifcsname\??externalfiguredefinition#1\endcsname
+ % \ifconditional\c_grph_include_trace_inheritance\writestatus\m!figures{inheriting from definition: #1}\fi
+ % \csname\??externalfiguredefinition#1\endcsname
+ %\fi
+ \ifcsname\??externalfigure#1:\s!parent\endcsname
+ \let\currentexternalfigure#1%
+ \fi
+ \ifcsname\??externalfigureinstance#1\endcsname
+ \ifconditional\c_grph_include_trace_inheritance\writestatus\m!figures{inheriting from instance: #1}\fi
+ \csname\??externalfigureinstance#1\endcsname
+ \fi}
+
+\newtoks\t_grph_include_local_settings
+
+\appendtoks
\let\textunderscore\letterunderscore % {\string _} % space needed as _ is now letter in unprotected mode (probably no longer needed)
%
\dontcomplain
\restorecatcodes
\forgetall
+\to \t_grph_include_local_settings
+
+\def\grph_include_place_inherit
+ {\ifconditional\c_grph_include_trace_inheritance
+ \writestatus\m!figures{label: \p_grph_include_label, name: \p_grph_include_name, parent: \p_grph_include_parent}%
+ \fi
+ \ifx\p_grph_include_parent\empty
+ % nothing to be done
+ \else\ifx\p_grph_include_parent\p_grph_include_label
+ % redundant
+ \else
+ \grph_include_inherit_from_parent\p_grph_include_parent
+ \fi\fi
+ \ifx\p_grph_include_label\empty
+ % nothing to be done
+ \else
+ \grph_include_inherit_from_parent\p_grph_include_label
+ \fi}
+
+\def\grph_include_place[#1][#2][#3]% [label][file][settings] | [file][settings] | [file][parent][settings]
+ {\bgroup
+ \advance\c_grph_include_nesting\plusone
+ \edef\currentexternalfigure{\the\c_grph_include_nesting}%
+ \checkexternalfigureparent % each inherits from the root
%
\the\everyexternalfigureresets
%
- \doifelsenothing{#3} % inherit from parent ... needs checking
- {\setupcurrentexternalfigures[#4,#5]}
- {\ifcsname\??externalfigureinstance#3\endcsname
- \pushmacro\grph_include_place
- \def\grph_include_place[##1][##2][##3][##4]{\setupcurrentexternalfigures[##4,#4,#5]}%
- \csname\??externalfigureinstance#3\endcsname
- \popmacro\grph_include_place
- \else
- \setupcurrentexternalfigures[#4,#5]%
- \fi}%
+ \edef\p_grph_include_label{#1}%
+ \let\p_grph_include_name\p_grph_include_label
+ \docheckassignment{#2}%
+ \ifassignment
+ % [label] [settings]
+ \let\p_grph_include_parent\p_grph_include_label
+ \grph_include_place_inherit
+ \setupcurrentexternalfigure[#2]%
+ \else
+ % [label] [parent] [settings]
+ \edef\p_grph_include_parent{#2}%
+ \ifx\p_grph_include_parent\empty
+ \let\p_grph_include_parent\p_grph_include_label
+ \fi
+ \grph_include_place_inherit
+ \setupcurrentexternalfigure[#3]%
+ \fi
%
\the\everyexternalfigurechecks
%
+ \the\t_grph_include_local_settings
+ \dostarttagged\t!image\empty
\ctxlua{figures.push {
- name = "#2",
- label = "#1", % todo: \externalfiguresparameter\c!label
- page = "\externalfiguresparameter\c!page",
- size = "\externalfiguresparameter\c!size",
- object = "\externalfiguresparameter\c!object",
- prefix = "\externalfiguresparameter\c!prefix",
- cache = "\externalfiguresparameter\c!cache",
- format = "\externalfiguresparameter\c!method",
- preset = "\externalfiguresparameter\c!prefix",
- controls = "\externalfiguresparameter\c!controls",
- resources = "\externalfiguresparameter\c!resources",
- preview = "\externalfiguresparameter\c!preview",
- display = "\externalfiguresparameter\c!display",
- mask = "\externalfiguresparameter\c!mask",
- conversion = "\externalfiguresparameter\c!conversion",
- resolution = "\externalfiguresparameter\c!resolution",
- color = "\internalspotcolorparent{\externalfiguresparameter\c!color}", % hack is needed
- ["repeat"] = "\externalfiguresparameter\c!repeat",
- width = "\externalfiguresparameter\c!width", % can be crap
- height = "\externalfiguresparameter\c!height", % can be crap
+ name = "\p_grph_include_name",
+ label = "\p_grph_include_label",
+ page = "\externalfigureparameter\c!page",
+ size = "\externalfigureparameter\c!size",
+ object = "\externalfigureparameter\c!object",
+ prefix = "\externalfigureparameter\c!prefix",
+ cache = "\externalfigureparameter\c!cache",
+ format = "\externalfigureparameter\c!method",
+ preset = "\externalfigureparameter\c!prefix",
+ controls = "\externalfigureparameter\c!controls",
+ resources = "\externalfigureparameter\c!resources",
+ preview = "\externalfigureparameter\c!preview",
+ display = "\externalfigureparameter\c!display",
+ mask = "\externalfigureparameter\c!mask",
+ conversion = "\externalfigureparameter\c!conversion",
+ resolution = "\externalfigureparameter\c!resolution",
+ color = "\internalspotcolorparent{\externalfigureparameter\c!color}", % hack is needed
+ ["repeat"] = "\externalfigureparameter\c!repeat",
+ width = "\externalfigureparameter\c!width", % can be crap
+ height = "\externalfigureparameter\c!height", % can be crap
} }%
\ctxlua{figures.identify()}%
% also mode: checkpresense only
@@ -249,7 +339,6 @@
\grph_include_finalize
\fi
\ctxlua{figures.pop()}%
- %
\dotagfigure
\naturalvbox attr \imageattribute 2 {\box\foundexternalfigure}%
\dostoptagged
@@ -264,21 +353,21 @@
\definescale % some day we will inherit
[\v!figure]
- [\c!hfactor =\externalfiguresparameter\c!hfactor,
- \c!wfactor =\externalfiguresparameter\c!wfactor,
- \c!factor =\externalfiguresparameter\c!factor,
- \c!maxwidth =\externalfiguresparameter\c!maxwidth ,
- \c!maxheight =\externalfiguresparameter\c!maxheight,
- \c!equalwidth =\externalfiguresparameter\c!equalwidth ,
- \c!equalheight=\externalfiguresparameter\c!equalheight,
- \c!xscale =\externalfiguresparameter\c!xscale,
- \c!yscale =\externalfiguresparameter\c!yscale,
- \c!scale =\externalfiguresparameter\c!scale,
- \c!sx =\externalfiguresparameter\c!sx,
- \c!sy =\externalfiguresparameter\c!sy,
- \c!width =\externalfiguresparameter\c!width,
- \c!height =\externalfiguresparameter\c!height,
- \c!lines =\externalfiguresparameter\c!lines]
+ [\c!hfactor =\externalfigureparameter\c!hfactor,
+ \c!wfactor =\externalfigureparameter\c!wfactor,
+ \c!factor =\externalfigureparameter\c!factor,
+ \c!maxwidth =\externalfigureparameter\c!maxwidth ,
+ \c!maxheight =\externalfigureparameter\c!maxheight,
+ \c!equalwidth =\externalfigureparameter\c!equalwidth ,
+ \c!equalheight=\externalfigureparameter\c!equalheight,
+ \c!xscale =\externalfigureparameter\c!xscale,
+ \c!yscale =\externalfigureparameter\c!yscale,
+ \c!scale =\externalfigureparameter\c!scale,
+ \c!sx =\externalfigureparameter\c!sx,
+ \c!sy =\externalfigureparameter\c!sy,
+ \c!width =\externalfigureparameter\c!width,
+ \c!height =\externalfigureparameter\c!height,
+ \c!lines =\externalfigureparameter\c!lines]
%D You can register additional suffixes with the following command:
%D
@@ -298,7 +387,7 @@
%D macro picks up the list.
\unexpanded\def\setfigurepathlist
- {\ctxlua{figures.setpaths("\externalfiguresparameter\c!location",\!!bs\externalfiguresparameter\c!directory\!!es)}}
+ {\ctxlua{figures.setpaths("\externalfigureparameter\c!location",\!!bs\externalfigureparameter\c!directory\!!es)}}
%D Variables:
@@ -347,23 +436,6 @@
\let\figurescalexscale \figurexscale
\let\figurescaleyscale \figureyscale
-%D The main command:
-
-\unexpanded\def\externalfigure
- {\dotripleempty\grph_include_set_type_synonym}
-
-\def\grph_include_set_type_synonym[#1][#2][#3]% [label][file][settings] | [file][settings] | [file][parent][settings]
- {\bgroup % also catched #1 == empty ... scales nicer now
- \ifcsname\??externalfigureinstance#1\endcsname
- \doifassignmentelse{#2}
- {\csname\??externalfigureinstance#1\endcsname[#2]}%
- {\csname\??externalfigureinstance#1\endcsname[#3]}%
- \else
- \useexternalfigure[\s!dummy][#1][#2][#3]%
- \csname\??externalfigureinstance\s!dummy\endcsname[]% [] is dummy arg 5
- \fi
- \egroup}
-
%D Calculating:
% \enabletrackers[figures.conversion]
@@ -388,7 +460,7 @@
\appendtoks
\ctxlua { % figures.defaultwidth .. maybe a dimen some day
- figures.setpaths("\externalfiguresparameter\c!location","\externalfiguresparameter\c!directory") ;
+ figures.setpaths("\externalfigureparameter\c!location","\externalfigureparameter\c!directory") ;
figures.defaultwidth = \number\dimexpr\defaultfigurewidth \relax ;
figures.defaultheight = \number\dimexpr\defaultfigureheight\relax ;
figures.boxnumber = \number\foundexternalfigure ;
@@ -396,22 +468,22 @@
\to \everyexternalfigureresets
\appendtoks
- \edef\p_option{\externalfiguresparameter\c!option}%
+ \edef\p_option{\externalfigureparameter\c!option}%
\ifx\p_option\v!frame
\setfalse\c_grph_include_skip
- \letexternalfiguresparameter\c!frame\v!on
+ \letexternalfigureparameter\c!frame\v!on
\else\ifx\p_option\v!empty
\settrue\c_grph_include_skip
- \letexternalfiguresparameter\c!frame\v!off
+ \letexternalfigureparameter\c!frame\v!off
\else
\setfalse\c_grph_include_skip
\fi\fi
% fake color in gray bitmaps, assumes that
% a transparent color is used
- \edef\p_foregroundcolor{\externalfiguresparameter\c!foregroundcolor}%
+ \edef\p_foregroundcolor{\externalfigureparameter\c!foregroundcolor}%
\ifx\p_foregroundcolor\empty \else
- \setexternalfiguresparameter\c!background{\v!foreground,\v!color}%
- \letexternalfiguresparameter\c!backgroundcolor\p_foregroundcolor
+ \setexternalfigureparameter\c!background{\v!foreground,\v!color}%
+ \letexternalfigureparameter\c!backgroundcolor\p_foregroundcolor
\fi
\to \everyexternalfigurechecks
@@ -458,7 +530,7 @@
\def\grph_include_finalize
{\global\setbox\foundexternalfigure\vbox
{\ifcase\figurestatus
- \letexternalfiguresparameter\c!frame\v!on
+ \letexternalfigureparameter\c!frame\v!on
\fi
\ifconditional\c_grph_include_flush
\ifconditional\c_grph_include_level % probably background
@@ -484,17 +556,17 @@
\grph_include_replacement\figurelabel\figurefileoriginal{unknown}%
\else
\the\externalfigurepostprocessors
- \edef\p_reset{\externalfiguresparameter\c!reset}%
+ \edef\p_reset{\externalfigureparameter\c!reset}%
\ifx\p_reset\v!yes
\wd\foundexternalfigure\figurewidth
\ht\foundexternalfigure\figureheight
\dp\foundexternalfigure\zeropoint
\box\foundexternalfigure
\else
- \letexternalfiguresparameter\c!offset\v!overlay
- \letexternalfiguresparameter\c!width \figurewidth
- \letexternalfiguresparameter\c!height\figureheight
- \inheritedexternalfiguresframed{\vfilll\box\foundexternalfigure}%
+ \letexternalfigureparameter\c!offset\v!overlay
+ \letexternalfigureparameter\c!width \figurewidth
+ \letexternalfigureparameter\c!height\figureheight
+ \inheritedexternalfigureframed{\vfilll\box\foundexternalfigure}%
\fi
\fi\fi
\fi
@@ -550,21 +622,21 @@
\appendtoks
\setfigurepathlist % the path may be used elsewhere too (as in x-res-04)
-\to \everysetupexternalfigures
+\to \everysetupexternalfigure
\appendtoks
- \ctxcommand{setfigurelookuporder("\externalfiguresparameter\c!order")}%
-\to \everysetupexternalfigures
+ \ctxcommand{setfigurelookuporder("\externalfigureparameter\c!order")}%
+\to \everysetupexternalfigure
\definecolor[missingfigurecolor][s=.8]
\def\grph_include_replacement#1#2#3%
{\bgroup
- \letexternalfiguresparameter\c!width\figurewidth
- \letexternalfiguresparameter\c!height\figureheight
- \letexternalfiguresparameter\c!background\v!color
- \setexternalfiguresparameter\c!backgroundcolor{missingfigurecolor}%
- \inheritedexternalfiguresframed
+ \letexternalfigureparameter\c!width\figurewidth
+ \letexternalfigureparameter\c!height\figureheight
+ \letexternalfigureparameter\c!background\v!color
+ \setexternalfigureparameter\c!backgroundcolor{missingfigurecolor}%
+ \inheritedexternalfigureframed
{\tt\tfxx \nohyphens
name: \expanded{\verbatimstring{#1}}\\%
file: \expanded{\verbatimstring{#2}}\\%