#LyX 1.1 created this file. For more info see http://www.lyx.org/ \lyxformat 2.16 \textclass article \language english \inputencoding latin1 \fontscheme default \graphics default \paperfontsize default \spacing single \papersize Default \paperpackage a4 \use_geometry 0 \use_amsmath 0 \paperorientation portrait \secnumdepth 3 \tocdepth 3 \paragraph_separation indent \defskip medskip \quotes_language english \quotes_times 2 \papercolumns 1 \papersides 1 \paperpagestyle default \layout Section The external material inset \layout Subsection Background \layout Standard One often requested feature from LyX users is to be able to interface LyX with XFig, Dia, or other similar applications that specialize in producing a certain kind of diagram, figure, schematic or whatever material might be relevant to include in your document. Previously, it was only possible to include boring, static, fixed images in LyX documents with the figure inset, but there are several limitations attached to this approach: \layout Itemize If you want to change the figure, you have to invoke an external program by hand \layout Itemize LyX does not notice that the referenced files change, so the on-screen display can fast become obsolete, and this is aggravated by the lack of a means of updating the display \layout Itemize The figure inset only supports PostScript material \layout Itemize The figure inset does not provide any mechanisms for coping with different exported formats such as DocBook, HTML or rawAscii \layout Standard The external material inset attempts to solve all of these problems \begin_float footnote \layout Standard Even if the figure inset can't solve all problems, it is still valuable because it does provide in-line preview of the figure, and supports advanced geometric transformations with a comfortable user interface. \end_float . It does this by offering a general method to interface LyX to external applications. Instead of introducing a long list of different insets taylored for each specific application, we chose to sacrify the in-line displaying of the included material in order to provide a general construct to cover a wide range of applications. The result is the external inset. An external inset presents itself in the document simply as a button, but don't let this fool you. When you click on it, a dialog will appear that allows you to chose exactly what material to include, and in the following you will learn that this is indeed a powerful mechanism that can solve all of the above problems, and more. \layout Subsection How does it work? \layout Standard The external inset is based on the concept of a \emph on template \emph default . A template is a specification of how LyX should interface with a certain kind of material. As bundled, LyX comes with predefined templates for XFig figures, Dia diagrams, various raster format images, gnuplot, and more. You can check the actual list by using the \family sans Insert\SpecialChar \menuseparator Insert external material \family default command. Furthermore, it is possible to roll your own template to support a specific kind of material. Later we'll describe in more detail what is involved, and hopefully you will submit all the templates you create so we can include them in a later LyX version. \layout Standard Another basic idea of the external inset is to distinguish between the original file that serves as a base for final material and the produced file that is included in your exported or printed document. For example, consider the case of a figure produced with XFig. The XFig application itself works on an original file with the \family typewriter .fig \family default extension. Within XFig, you create and change your figure, and when you are done, you save the \family typewriter fig \family default -file. When you want to include the figure in your document, you invoke \family typewriter transfig \family default in order to create a PostScript file that can readily be included in your LaTeX file. In this case, the \family typewriter .fig \family default file is the original file, and the PostScript file is the produced file. \layout Standard This distinction is important in order to allow updating of the material while you are in the process of writing the document. Furthermore, it provides us with the flexibility that is needed to support multiple export formats. For instance, in the case of an Ascii resulting file, it is not exactly an award-winning idea to include the figure as raw PostScript. Instead, you'd either prefer to just include a reference to the figure, or try to invoke some graphics to Ascii converter to make the final result look similar to the real graphics. The external material inset allows you to do this, because it is parameterized on the different export formats that LyX supports. \layout Standard Besides supporting the production of different products according to the exported format, the external inset supports tight integration with editing and viewing applications. In the case of an XFig figure, you are able to invoke xfig on the original file with a single click from within the external inset in LyX, and also preview the produced PostScript file with ghostview with another click. No more fiddling around with the command line and/or file browsers to locate and manipulate the original or produced files. In this way, you are finally able to take full advantage of the many different applications that are relevant to use when you write your documents, and ultimately be more productive. \layout Standard So, all in all, LyX has information about a number of different programs to use behind the scenes in order to realize all of this machinery. This information, in fact, is exactly what is contained in the templates. To each template, there is associated a list of command lines that are used to invoke applications, convert the original file to the produced file, and more. This mechanism allows the advanced user to extend the capabilities of LyX without fiddling with the source code. It requires some footwork to define all the different commands and flags, but luckily, the LyX team did all the hard work and specified these for you. \layout Standard But before the trees grow into the skies, we have to admit that we did take one tiny short-cut. Since the external inset can produce many different kinds of produced files to go with each exported format, one could also expect that it would be possible to preview each product. But, the LyX team decides against this in order to keep the user interface simple. Instead of providing a button for each exported file format, we decided to introduce the concept of the primary file format and just have one button. When you press \family sans View result \family default in the external inset dialog, you will get a view of the produced file in the primary file format. And the primary file format is specified by your document class. For most document classes, the primary file format is LaTeX, but for the DocBook document classes, the primary file format is DocBook. So, when you view the produced file, keep in mind that it will only be a preview of what the main result will be. If you want to see how other exported formats turn out, you have to export them and preview them by hand. \layout Subsection The external material inset dialog \layout Standard You insert an external inset from the \family sans Insert \family default menu. When you do this, a button is inserted into your document, and the external material inset dialog is shown. This dialog allows you to describe exactly what material should be included, and also how it should be included. Furthermore, it provides access to the external applications to either view, edit or produce the material that is used in the resulting file. \layout Standard At the top of this dialog, there is a drop-down list where you can chose which template the inset should use. Just below the template drop-down, there's an text area with a short blurp about the chosen template that should help you use it. Most often, it will provide a short description of the template, and a few hints on how to parameterize the use of it. Further down, you'll find a filename input field along with a browse-button that allows you to chose which file should be included, with the standard file browser. Thus this field specifies the original file. Since the produced file is automatically generated when needed, there is no need to give access to it in the user interface. \layout Standard At the bottom of the dialog, you'll find a general input box called \family sans Parameters \family default . This box is generally used to parameterize the specific template. The specific use should be covered in the help blurp associated with the template, but in general it typically allows you to define variations on how the produced file should be generated. \layout Standard At the right side of the dialog, you'll find three buttons: \family sans Edit file \family default , \family sans View result \family default , and \family sans Update result \family default . These in turn allows you to edit your original file with the appropriate editing application, view the produced file as included in the primary format document, and finally force an update of the resulting material in the primary format. Normally, the \family sans Update result \family default button will be disabled, because most templates are configured to automatically update the produced file when needed. In those cases, there is no need to force the production of a new produced file. However, some templates are configured to not be automatically producing the residual product, because the cost of producing the produced file might be so large that it would be a pain to do it all the time. Those insets are known as \emph on manual \emph default external insets. In those cases, you can use the button to force the production of the produced file exactly when you need it, and thus control the amount of work that is done. In fact, it is \emph on your \emph default responsibility to do this to keep the produced files current at all times: before printing, before exporting, before viewing, etc. At some time in the future, it might be possible that LyX will help you with this task. It would be nice to use a \family sans Edit\SpecialChar \menuseparator Update all external inset \family default command to update all external insets that use a manual template. But be prepared that it might take some time for the updating to implemented. \layout Standard At the bottom of the dialog, you find the normal \family sans OK \family default and \family sans Cancel \family default buttons. The only thing worth mentioning about these is that any changes in the template, filename or parameters are actually applied whenever you press \family sans Edit file \family default , \family sans View result \family default or \family sans Update result \family default buttons. This implies that after using one of those, you will only be able to undo changes that occured after the use of those buttons, by pressing \family sans Cancel \family default . Fortunately, you can use the general undo feature in LyX to revert to a previous state. \layout Subsection Examples \layout Standard In this section, we should include some examples of use of the external material inset. Those examples could include: \layout Itemize External raster images \layout Itemize External XFig figures \layout Itemize Chess diagrams \layout Itemize Sound samples \layout Itemize The use of makefiles \layout Itemize Recursive external LyX templates \layout Subsection The external template configuration file \layout Standard It is relatively easy to add custom external template definitions to LyX. However, be aware this doing this in an careless manner most probably \emph on will \emph default introduce an easily exploitable security hole. So before you do this, please read the discussion about security which will follow later. \layout Standard Having said that, we encourage you to submit any interesting templates that you create. \layout Standard The external templates are defined in the \family typewriter lib/external_templates \family default file. You can place your own version in \family typewriter .lyx/external_templates \family default . At some point in time, hopefully somebody will document the template contents, and the syntax used to define your templates. \layout Subsection The substitution mechanism \layout Standard When the external material inset invokes an external program, it is done on the basis of a command defined in the template configuration file. These commands can contain various macros that are expanded before execution. Execution always take place in the directory of the containing document. \layout Standard Also, whenever an external inset is to be displayed, the name will be produced by the substitution mechanism. \layout Standard The available macros are the following: \layout Description $$FName The filename of the file specified in the external inset dialog. \layout Description $$Basename The filename without the extension. \layout Description $$Tempname A name and full path to a temporary file which will be automatically deleted whenever the containing document is closed, or the external inset deleted. \layout Description $$Contents( \begin_inset Quotes eld \end_inset filename.ext \begin_inset Quotes erd \end_inset ) This macro will expand to the contents of the file with the name \family typewriter filename.ext \family default . \layout Description $$Sysdir This macro will expand to the absolute path of the system directory. This is typically used to point to the various helper scripts that are bundled with LyX. \layout Standard In addition to these, the facility will expand general environment variables with a syntax like \family typewriter ${PATH} \family default . \layout Subsection Security discussion \layout Standard The external material inset interfaces with a lot of external programs and does so automatically, so we have to consider the security implications of this. In particular, since you have the option of including your own filenames and/or parameter strings and those are expanded into a command, it seems that it would be possible to create a malicious document which executes arbitrary commands when a user views or prints the document. This is something we definately want to avoid. \layout Standard However, since the external program commands are specified in the template configuration file only, there are no security issues if LyX is properly configured with safe templates only. This is so because the external programs are invoked with the \family typewriter execvp \family default -system call rather than the \family typewriter system \family default system-call, so it's not possible to execute arbitrary commands from the filename or parameter section via the shell. \layout Standard This also implies that you are restricted in what command strings you can use in the external material templates. In particular, pipes and redirection are not readily available. This has to be so if LyX should remain safe. If you want to use some of the shell features, you should write a safe script to do this in a controlled manner, and then invoke the script from the command string. In the \family typewriter lib/scripts \family default directory of the LyX installation, you can find a safe wrapper script \family typewriter general_command_wrapper.py \family default that supports redirection of input and output. That can serve as an example for how to write safe template scripts. For a more advanced example that uses \family typewriter fork \family default and friends, take a look at the \family typewriter pic2ascii.py \family default converter script. \layout Standard It is possible to design a template that interacts directly with the shell, but since this would allow a malicious user to execute arbitrary commands by writing clever filenames and/or parameters, we generally recommend that you only use safe scripts that work with the \family typewriter execvp \family default system call in a controlled manner. Of course, for use in a controlled environment, it can be tempting to just fall back to use ordinary shell scripts. If you do so, be aware that you \emph on will \emph default provide an easily exploitable security hole in your system. Of course it stands to reason that such unsafe templates will never be included in the standard LyX distribution, although we do encourage people to submit new templates in the open source tradition. But LyX as shipped from the official distribution channels will never have unsafe templates. \layout Standard The external material inset provides a lot of power, and you have to be careful not to introduce security hazards with this power. A subtile error in a single line in an innocent looking script can open the door to huge security problems. So if you do not fully understand the issues, we recommend that you consult a knowledgable security professional or the LyX development team if you have any questions about whether a given template is safe or not. And do this before you use it in an uncontrolled environment. \layout Subsection The future of the external inset \layout Standard The current implementation of the external inset is a stable and powerful construct that provides raw access to the inner parts of LyX, but as with any feature in LyX, it should always be considered work-in-progress. When and if somebody has time to continue work on it, here are some general directions that could be approached: \layout Itemize Support in-line previewing in various formats, rather than the button text we are restricted to now. \layout Itemize Support in-line editing using OpenParts or any other relevant protocol. \layout Itemize Extend the dynamic information to have optional parameter fields for the conversion commands in all export formats, and to have optional parameter fields for what is produced into all the different exported formats. At the moment, we are restricted to only one parameter string that is multiplex ed across these many applications. Also, a change like this would allow us to get rid of the strange primary target format restrictions. \layout Itemize Extend the framework to provide more intelligent customization options in addition to the rather simplistic raw parameter strings. With a suitable scripting language, it would be possible to implement user friendly versions of many customizable insets that supports a wide range of formats, LaTeX packages, editors, etc. \the_end