summaryrefslogtreecommitdiff
path: root/Master/texmf-dist
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2011-08-26 22:28:27 +0000
committerKarl Berry <karl@freefriends.org>2011-08-26 22:28:27 +0000
commitc2b5d929f28df0fa1349a5515c6ca7475ea24388 (patch)
tree098bb0e00075333412ddaa2b257483c0d9f05739 /Master/texmf-dist
parent5c3e7d14dc14232cab367595070b49c281524cad (diff)
context-filter (24aug11)
git-svn-id: svn://tug.org/texlive/trunk@23712 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist')
-rw-r--r--Master/texmf-dist/doc/context/third/filter/filter.txt148
-rw-r--r--Master/texmf-dist/tex/context/third/filter/t-filter.tex99
2 files changed, 187 insertions, 60 deletions
diff --git a/Master/texmf-dist/doc/context/third/filter/filter.txt b/Master/texmf-dist/doc/context/third/filter/filter.txt
index 6487c818d89..62243a553ca 100644
--- a/Master/texmf-dist/doc/context/third/filter/filter.txt
+++ b/Master/texmf-dist/doc/context/third/filter/filter.txt
@@ -37,9 +37,9 @@ Installation
------------
Writing installation instructions is always boring. If you are using ConTeXt
-minimals, you can install the module using
+standalone, you can install the module using
- first-setup.sh --extras="t-filter"
+ first-setup.sh --modules="t-filter"
Depending on your TeX distribution, you may already have the module.
To verify, check if
@@ -158,6 +158,20 @@ definition:
continue=yes,
...]
+Sometimes you want to force a rerun of all filters, even when `continue=yes` is
+set. This could be because the filters depend on an external script that might
+have changed. To force a rerun of all filters, enable the
+[mode](http://wiki.contextgarden.net/Modes) `force` either by adding
+`mode=force` to the compiler:
+
+ context --mode=force filename
+
+or adding
+
+ \enablemode[force]
+
+somewhere near the top of your file.
+
Reading the input
----------------
@@ -254,29 +268,36 @@ do not work. If you try to use a absolute path like
you will get an error message
- t-filter : Fatal Error: Cannot use absolute path /tmp/ as directory
+ t-filter > Fatal Error: Cannot use absolute path /tmp/ as directory
and compilation will stop.
-Deleting temporary files
-------------------------
+Disabling filters
+----------------
-If you want to delete the temporary files generated by the module, pass
-`--purge` option while calling `context`:
+Adding `state=stop` option disables the filters. The
+`\externalfilterinputfile` is still written, but the filter is not run.
- context --purge filename
+When used in conjunction with `continue=yes` and `directory=...`, this
+is useful for sharing your files with others who do not have the
+external program that you are using.
-This will delete the temporary files at the end of the compilation. When using
-`continue=yes`, deleting the files after each compilation defeats the purpose of
-caching the results. In that case, it is better to simply use
+Enabling the `reuse` mode (before the `filter` module is loaded) sets
+`state=stop` as the default value.
- context filename
+Deleting temporary files
+------------------------
-Once you are finished with your project and want to clean up the working
-directory, call:
+To delete the temporary files generated by the module, call
+
+ context --purgeall --pattern=filename
+
+Do **not** use the file extension. To delete all temporary files in the
+current directory, use
context --purgeall
+
Standard options
---------------
@@ -420,6 +441,71 @@ options:
The options in the `[...]` are the same as those for `\defineexternalfilter`.
+Prepend and append text
+-----------------------
+
+**NOTE** Only works in MkIV
+
+Some external programs require boilerplate text at the beginning and end of each
+file. Including this boilerplate code in each snippet can get verbose. The
+filter module provides two options `bufferbefore` and `bufferafter` to shorten
+such snippets. Define the boilerplate code in ConTeXt buffers and then use
+
+ \defineexternalfilter
+ [...]
+ [...
+ bufferbefore={...list of buffers...},
+ bufferafter={...list of buffers...},
+ ]
+
+For example, suppose you want to generate images using a latex package that does
+not work well with ConTeXt, say shak. One way to use this is as follows: first
+define a file that processes its content using `latex`.
+
+ \defineexternalfilter
+ [chess]
+ [filter=pdflatex,
+ output=\externalfilterbasefile.pdf,
+ readcommand=\readPDFfile,
+ ]
+
+ \def\readPDFfile#1{\externalfigure[#1]}
+
+
+Next create buffers containing boilerplate code needed to run latex:
+
+ \startbuffer[chess::before]
+ \documentclass{minimal}
+ \usepackage{skak}
+ \usepackage[active,tightpage]{preview}
+
+ \begin{document}
+ \begin{preview}
+ \newgame
+ \hidemoves{
+ \stopbuffer
+
+ \startbuffer[chess::after]
+ }
+ \showboard
+ \end{preview}
+ \end{document}
+ \stopbuffer
+
+and tell the filter to prepend and append these buffers
+
+ \setupexternalfilter
+ [chess]
+ [bufferbefore={chess::before},
+ bufferafter={chess::after}]
+
+Then you can use
+
+ \inlinechess{1.e4 e5 2. Nf3 Nc6 3.Bb5}
+
+to get a chess board.
+
+
Limitations
------------
@@ -447,32 +533,28 @@ indicate what is happening. Loading of the module is indicated by:
Whenever a filter is executed, the expanded name of the command is displayed.
For example, for the markdown filter we get:
- t-filter : command : pandoc -w context -o markdown-temp-markdown.tex markdown-temp-markdown.tmp
+ t-filter > command : pandoc -w context -o markdown-temp-markdown.tex markdown-temp-markdown.tmp
If, for some reason, the output file is not generated, or not found, a message
similar to
- t-filter : file markdown-temp-markdown.tex cannot be found
+ t-filter > file markdown-temp-markdown.tex cannot be found
+ t-filter > current filter : markdown
+ t-filter > base file : markdown-temp-markdown
+ t-filter > input file : markdown-temp-markdown.tmp
+ t-filter > output file : markdown-temp-markdown.tex
is displayed on the console. At the same time, the string
[[output file missing]]
-is displayed in the PDF output. To debug what went wrong, add
+is displayed in the PDF output. This data, along with the name of the filter
+command, is useful for debugging what went wrong. To get more debugging
+information add
\traceexternalfilters
-in your tex file. This shows the name of all input and output files on the
-console:
-
- t-filter : current filter : markdown
- t-filter : base file : markdown-temp-markdown
- t-filter : input file : markdown-temp-markdown.tmp
- t-filter : output file : markdown-temp-markdown.tex
-
-This data, along with the name of the filter command, is useful for debugging
-what went wrong.
-
+in your tex file. This shows the name of the filters when they are defined.
Version History
@@ -502,8 +584,16 @@ Version History
- **2011.02.27**
- The external files are called `\jobname-temp-<filter>*` instead of
`\jobname-externalfilter-<filter>*`. As a result, these files are deleted
- by `context --purge`.
+ by `context --purgeall`.
- **2011.03.06**
- Complete rewrite of internal macro names. The internal macros are now
named `\modulename::command_name`. This is an experiment to see if this
style works better than the traditional naming convention in TeX.
+- **2011.06.16**
+ - Added `force` mode to force recompilation of all filters that have
+ `continue=yes`.
+ - Added `reuse` mode to skip running all filters that have
+ `continue=yes`.
+ - Added `state=stop` option to skip running external filter.
+- **2011.08.23**
+ - Added `bufferbefore` and `bufferafter` options
diff --git a/Master/texmf-dist/tex/context/third/filter/t-filter.tex b/Master/texmf-dist/tex/context/third/filter/t-filter.tex
index 6f95644953f..2d89f168ef4 100644
--- a/Master/texmf-dist/tex/context/third/filter/t-filter.tex
+++ b/Master/texmf-dist/tex/context/third/filter/t-filter.tex
@@ -1,6 +1,6 @@
%D \module
%D [ file=t-filter,
-%D version=2011.06.12,
+%D version=2011.08.23,
%D title=\CONTEXT\ User Module,
%D subtitle=Filter,
%D author=Aditya Mahajan,
@@ -36,15 +36,6 @@
\setinterfaceconstant {readcommand} {readcommand}
\stopinterface
-\def\m!externalfilter{t-filter}
-
-%D \subsubject {Messages}
-
-\setinterfacemessage{externalfilter}{title} {\m!externalfilter}
-\setinterfacemessage{externalfilter}{notfound} {file -- cannot be found}
-\setinterfacemessage{externalfilter}{missing} {output file missing}
-\setinterfacemessage{externalfilter}{forbidden} {Fatal Error: Cannot use absolute path -- as directory}
-\setinterfacemessage{externalfilter}{slash} {Appending / to directory -- }
%D \subsubject {Name space}
@@ -62,6 +53,17 @@
\doifmode\s!mkiv
{\installattributehandler \externalfilter::namespace \externalfilter::id}
+\def\m!externalfilter{t-filter}
+
+%D \subsubject {Messages}
+
+\setinterfacemessage\m!externalfilter{title} {\m!externalfilter}
+\setinterfacemessage\m!externalfilter{notfound} {file -- cannot be found}
+\setinterfacemessage\m!externalfilter{missing} {output file missing}
+\setinterfacemessage\m!externalfilter{forbidden} {Fatal Error: Cannot use absolute path -- as directory}
+\setinterfacemessage\m!externalfilter{slash} {Appending / to directory -- }
+\setinterfacemessage\m!externalfilter{reuse} {\c!state=\v!stop : Not running filter on file --}
+
% For backward compatibility
\let\setupexternalfilters \setupexternalfilter
@@ -72,12 +74,10 @@
\let\traceexternalfilters\traceexternalfilterstrue
\starttexdefinition externalfilter::show_filenames
- \iftraceexternalfilters
- \writestatus\m!externalfilter{current filter : \externalfilter::name}
- \writestatus\m!externalfilter{base file : \externalfilter::base_file}
- \writestatus\m!externalfilter{input file : \externalfilter::input_file}
- \writestatus\m!externalfilter{output file : \externalfilter::output_file}
- \fi
+ \writestatus\m!externalfilter{current filter : \externalfilter::name}
+ \writestatus\m!externalfilter{base file : \externalfilter::base_file}
+ \writestatus\m!externalfilter{input file : \externalfilter::input_file}
+ \writestatus\m!externalfilter{output file : \externalfilter::output_file}
\stoptexdefinition
\starttexdefinition externalfilter::show_status #1
@@ -100,8 +100,8 @@
\starttexdefinition externalfilter::define [#1][#2]
\externalfilter::show_status{defining filter : #1}
+ \setupexternalfilter[#1][\s!parent=\externalfilter::namespace,#2]
\edef\externalfilter::name{#1}
- \getparameters[\externalfilter::namespace#1][\s!parent=\externalfilter::namespace,#2]
\doif{\externalfilterparameter\c!continue}\v!yes
{\expandafter\newcounter\csname\externalfilter::count\endcsname}
@@ -111,6 +111,7 @@
\setvalue{process#1file}{\dodoubleargument\externalfilter::process_file[#1]}
\setvalue{inline#1}{\externalfilter::inline[#1]}
+
\stoptexdefinition
\starttexdefinition externalfilter::start [#1][#2]
@@ -121,7 +122,7 @@
\edef\externalfilter::name{#1}
\begingroup % to keep assignments local
- \getparameters[\externalfilter::namespace#1][\c!name=,#2]
+ \setupexternalfilter[#1][\c!name=,#2]
\externalfilter::set_filenames
@@ -133,7 +134,7 @@
\begingroup
\edef\externalfilter::name{#1}
- \getparameters[\externalfilter::namespace#1][\c!name=,#2]
+ \setupexternalfilter[#1][\c!name=,#2]
\externalfilter::set_directory
@@ -146,7 +147,7 @@
% \c!directory; even if the input is from some other directory
\def\externalfilter::output_file{\externalfilter::get_directory\externalfilterparameter\c!output}
- \externalfilter::show_filenames
+ \iftraceexternalfilters \externalfilter::show_filenames \fi
\externalfilter::execute_filter
\externalfilter::read_processed_file
@@ -157,7 +158,7 @@
\edef\externalfilter::name{#1}
\begingroup % to keep assignments local
- \getparameters[\externalfilter::namespace#1][\c!name=]
+ \setupexternalfilter[#1][\c!name=]
\externalfilter::set_filenames
@@ -165,6 +166,7 @@
\futurelet\next\externalfilter::inline_aux
\stoptexdefinition
+
%D \subsubject {Catcode tables}
%D
%D Just to be sure, I define all catcode tables that are needed within the
@@ -272,13 +274,13 @@
\starttexdefinition externalfilter::set_directory_aux
\doif{\externalfilter::get_first_character\externalfilter::get_directory}{/}
{\writeline
- \showmessage\externalfilter::id{forbidden}\externalfilter::get_directory
+ \showmessage\m!externalfilter{forbidden}\externalfilter::get_directory
\batchmode
\errmessage{}
\normalend}
\doifnot{\externalfilter::get_last_character\externalfilter::get_directory}{/}
- {\showmessage\externalfilter::id{slash}\externalfilter::get_directory
+ {\showmessage\m!externalfilter{slash}\externalfilter::get_directory
\edef\externalfilter::get_directory{\externalfilter::get_directory/}}
\stoptexdefinition
@@ -320,7 +322,7 @@
% Append directory name to the name of the output file
\edef\externalfilter::output_file{\externalfilter::get_directory\externalfilterparameter\c!output}
- \externalfilter::show_filenames
+ \iftraceexternalfilters \externalfilter::show_filenames \fi
\stoptexdefinition
@@ -330,7 +332,25 @@
\starttexdefinition externalfilter::process_filter
% By defualt, buffers are in memory in MkIV. So, we save them to disk
- \doifmode\s!mkiv{\savebuffer[\externalfilter::temp_file][\externalfilter::input_file]}
+ % To imitate the behavior of MkII, we need
+ %
+ % \doifmode\s!mkiv{\savebuffer[\externalfilter::temp_file][\externalfilter::input_file]}
+ %
+ % However, in MkIV, we can save a list of buffers to a file. The empty
+ % elements of the list are ignored. So, instead we use the following
+ %\doifmode\s!mkiv
+ %{\savebuffer[\externalfilterparameter{\c!buffer\c!before},\externalfilter::temp_file,\externalfilterparameter{\c!buffer\c!after}]
+ % [\externalfilter::input_file]}
+ \startmode[\s!mkiv]
+ \savebuffer[\externalfilterparameter{\c!buffer\c!before},
+ \externalfilter::temp_file,
+ \externalfilterparameter{\c!buffer\c!after}]
+ [\externalfilter::id]
+ \startluacode
+ os.rename("\jobname-\externalfilter::id.\f!temporaryextension", "\externalfilter::input_file")
+ \stopluacode
+ \stopmode
+
\externalfilter::execute_filter
\externalfilter::read_processed_file
@@ -351,10 +371,16 @@
\externalfilter::show_filtercommand
\doifelse{\externalfilterparameter\c!continue}\v!yes
- {\doifmode{*first}
- {\executesystemcommand
- {mtxrun --ifchanged=\externalfilter::input_file\space
- --direct \externalfilterparameter\c!filtercommand}}}
+ {\doifelse{\externalfilterparameter\c!state}\v!stop
+ {\showmessage\m!externalfilter{reuse}\externalfilter::input_file}
+ {\doifmode{*first}
+ {\doifmodeelse{force}
+ {\message{\externalfilterparameter\c!filtercommand}
+ \executesystemcommand
+ {\externalfilterparameter\c!filtercommand}}
+ {\executesystemcommand
+ {mtxrun --ifchanged=\externalfilter::input_file\space
+ --direct \externalfilterparameter\c!filtercommand}}}}}
{\executesystemcommand
{\externalfilterparameter\c!filtercommand}}
\stoptexdefinition
@@ -365,9 +391,10 @@
\doif{\externalfilterparameter\c!read}\v!yes
{\doiffileelse{\externalfilter::output_file}
{\externalfilter::read_processed_file_aux}
- {\showmessage\externalfilter::id{notfound}\externalfilter::output_file
+ {\showmessage\m!externalfilter{notfound}\externalfilter::output_file
+ \externalfilter::show_filenames
\blank
- {\tttf [[\getmessage\externalfilter::id{missing}]]}
+ {\tttf [[\getmessage\m!externalfilter{missing}]]}
\blank}}
\stoptexdefinition
@@ -402,12 +429,22 @@
\c!output=\externalfilterbasefile.tex,
\c!filter=,
\c!filtercommand={\externalfilterparameter\c!filter\space \externalfilter::input_file},
+ \c!buffer\c!before=,
+ \c!buffer\c!after=,
]
+\doifmodeelse{reuse}
+ {\setupexternalfilters[state=stop]}
+ {\setupexternalfilters[state=start]}
+
\def\externalfilterbasefile {\externalfilter::base_file}
\def\externalfilterinputfile {\externalfilter::input_file}
\def\externalfilteroutputfile{\externalfilter::output_file}
\def\currentexternalfilter {\externalfilter::name}
+
+% Default value
+\def\externalfilter::input_file {}
+\def\externalfilter::output_file{}
\protectmodulecatcodes
\stopmodule