#LyX 2.2 created this file. For more info see http://www.lyx.org/ \lyxformat 503 \begin_document \begin_header \origin unavailable \textclass article \use_default_options false \maintain_unincluded_children false \language british \language_package default \inputencoding auto \fontencoding global \font_roman "default" "default" \font_sans "default" "default" \font_typewriter "default" "default" \font_math "auto" "auto" \font_default_family default \use_non_tex_fonts false \font_sc false \font_osf false \font_sf_scale 100 100 \font_tt_scale 100 100 \graphics default \default_output_format default \output_sync 0 \bibtex_command default \index_command default \paperfontsize default \spacing single \use_hyperref false \papersize default \use_geometry false \use_package amsmath 1 \use_package amssymb 1 \use_package cancel 1 \use_package esint 1 \use_package mathdots 0 \use_package mathtools 1 \use_package mhchem 0 \use_package stackrel 1 \use_package stmaryrd 1 \use_package undertilde 1 \cite_engine basic \cite_engine_type default \biblio_style plain \use_bibtopic false \use_indices false \paperorientation portrait \suppress_date false \justification true \use_refstyle 0 \index Index \shortcut idx \color #008000 \end_index \secnumdepth 3 \tocdepth 3 \paragraph_separation indent \paragraph_indentation default \quotes_language english \papercolumns 1 \papersides 1 \paperpagestyle default \tracking_changes false \html_math_output 0 \html_css_as_file 0 \output_changes false \html_be_strict false \end_header \begin_body \begin_layout Title Dynamic Macros for \SpecialChar LyX \end_layout \begin_layout Author Stefan Schimanski \begin_inset Newline newline \end_inset \begin_inset Flex URL status collapsed \begin_layout Plain Layout sts@1stein.org \end_layout \end_inset \end_layout \begin_layout Date 21.10.2007 \end_layout \begin_layout Section The old system \end_layout \begin_layout Standard \SpecialChar LyX has the concept of math macros for quite some time. In \SpecialChar LyX 1.4 or 1.5 you can create one in your document by calling the \family typewriter math-macro \family default command in the mini buffer. Visually this results in something equivalent to a \SpecialChar TeX macro: \begin_inset listings inline false status open \begin_layout Plain Layout \backslash newcommand{ \backslash foo}{ \backslash frac{1}{2}} \end_layout \end_inset \end_layout \begin_layout Standard After \SpecialChar LyX processed this, the command is available in math environments in the same documents. But internally there is nothing more than \series bold one \series default global macro table. The position inside the document does not matter. The command is available even in front of the definition. But even worse, this global macro table is global for all opened documents. If two buffers use the same macro name with different definitions, you are in trouble. The behaviour is undefined. If you are lucky \SpecialChar LyX will not crash. Nothing must be said about redefining a macro later in the document: the behaviour of \SpecialChar LyX will not be what you expect. \end_layout \begin_layout Standard \SpecialChar LyX 1.4 and 1.5 do not show the support for this kind of macro very prominently. In fact it is described in the \begin_inset Quotes eld \end_inset Extended Features \begin_inset Quotes erd \end_inset manual. But there is no menu item to create macros. Next to the mentioned method with the mini buffer you can use the \begin_inset Quotes eld \end_inset Ctrl-L \begin_inset Quotes erd \end_inset short cut to convert a raw \backslash newcommand into a \SpecialChar LyX math macro. Hence the role of macro is more of a power user tool for users who know what they are doing. \end_layout \begin_layout Section A wish list for a new macro implementation \end_layout \begin_layout Standard In the following usecases are shown which can be wished to be supported if macros are reimplemented. Most of them are not possible in the old implementation, or at least very hard to do. \end_layout \begin_layout Enumerate Define a \series bold new macro \series default with a known arity ("arity" = number of arguments). Use instances later on in the document. \end_layout \begin_layout Enumerate \series bold Redefine \series default a macro to use the same macro name with different definitions in different areas of the document. \end_layout \begin_layout Enumerate Have \family typewriter \backslash newcommand \family default in the preamble (i.e. by importing tex code) or \series bold not accessible \series default as a \SpecialChar LyX macro in another way, and then define the command as a native \SpecialChar LyX math macro later. All the uses of the old command should then turn into instances of the \SpecialChar LyX math macro. \end_layout \begin_layout Enumerate \series bold Rename \series default a macro and also adapt all the instance of the macro in the document. \end_layout \begin_layout Enumerate \series bold Change the arity \series default of a macro (normally probably increase it), maybe with a default value used in instances of the macro (possibly empty). \end_layout \begin_layout Enumerate \series bold Removal \series default of a macro. \end_layout \begin_layout Enumerate Insertion of a macro via the \series bold menu \series default like "Insert->MathMacro". \end_layout \begin_layout Enumerate \series bold Moving \series default of a macro. \end_layout \begin_layout Enumerate \series bold \begin_inset CommandInset label LatexCommand label name "subsec:listedit" \end_inset \series default Editing of a macro instance as a \series bold list \series default of #1: __, #2: __, i.e. it \series bold unfold \series default s when the cursor goes inside. \end_layout \begin_layout Enumerate Editing of macros \series bold inline \series default (the macro definition will be read-only, only the arguments as holes are editable). \end_layout \begin_layout Enumerate Changing of the \series bold editing behaviour \series default of \series bold \begin_inset CommandInset ref LatexCommand ref reference "subsec:listedit" \end_inset \series default for certain macros, not only globally. \end_layout \begin_layout Enumerate Defining dynamic \series bold macros inside of macros \series default . \end_layout \begin_layout Enumerate Using macros with the \series bold same name \series default , but different definitions in different open documents or parts of the same document. \end_layout \begin_layout Enumerate Using macros from the \series bold master document \series default . \end_layout \begin_layout Enumerate Using the same argument, e.g. #1, ( \series bold non-linearly \series default ) more than once in the definition, like \family typewriter \backslash newcommand{ \backslash ntothen}[1]{#1^#1} \end_layout \begin_layout Enumerate \series bold Patterns \series default like \family typewriter \backslash def \backslash foo #1/#2{ \backslash frac{#1}{#2}} \end_layout \begin_layout Enumerate \series bold Higher order \series default substitution (or call-by-name text substitution) like \family typewriter \backslash def \backslash foo #1{#1 12} \family default , which is applicable like \family typewriter \backslash foo \backslash frac \family default to give \family typewriter 1/2 \end_layout \begin_layout Enumerate \series bold Optional \series default parameters like \family typewriter \backslash newcommand{ \backslash foo}[2][x]{#2_#1} \end_layout \begin_layout Standard The old implementation supports the following: \series bold new macro \series default , \series bold moving \series default , \series bold list \series default , \series bold master document \series default , \series bold non-linear. \series default Though support of master documents is more or less an coincidence by the global table. \end_layout \begin_layout Standard The implementation described later (short: the new implementation) supports the following: \series bold new macro \series default , \series bold redefine \series default , \series bold not accessible \series default , \series bold change the arity \series default , \series bold removal \series default , \series bold menu \series default , \series bold moving \series default , \series bold unfolds \series default , \series bold inline \series default , \series bold same name \series default , \series bold master documents \series default , \series bold non-linearly \series default , \series bold optional \series default . \end_layout \begin_layout Standard Not supported are: \series bold patterns \series default , \series bold higher order \series default , \series bold macros inside of macros \series default , \series bold editing behaviour \series default , \series bold list \series default , \series bold rename \series default . The last 3 should be doable without much work, maybe also \series bold patterns \series default . \end_layout \begin_layout Subsection Main deficiencies of the old system \end_layout \begin_layout Standard The main problem of the old implementation is that it is not dynamic at all. A macro is resolved (i.e. the lookup in the global table takes place) when the internal object is created, e.g. while parsing of the \family typewriter .lyx \family default document or when typing \family typewriter \backslash foo \family default . If no macro definition of the right name exists at this time, an ERT is created. \end_layout \begin_layout Standard Moreover there is no position awareness of the definition, only during loading of a document there is something like that because macro definitions are put into the global table at the point in the document where it appears. \end_layout \begin_layout Section A new approach \end_layout \begin_layout Standard The goal of a new macro approach must be to support as many use cases subsection 1.2 as possible, or at least make an implementation possible of the remaining ones. Moreover a proper implementation better brings most of \SpecialChar TeX 's power of math command into \SpecialChar LyX . \end_layout \begin_layout Standard In a few words the new approach could be described as follow: \end_layout \begin_layout Itemize A macro is a dynamic inset which can \begin_inset Quotes eld \end_inset eat up \begin_inset Quotes erd \end_inset or \begin_inset Quotes eld \end_inset spit out \begin_inset Quotes erd \end_inset insets which follow the macro, depending on the success to resolve it and the arity of the macro definition at the position in the document. \end_layout \begin_layout Itemize Macros are resolved again every time it is redrawn on screen if the macro definition changed which is valid at the position. \end_layout \begin_layout Standard This \begin_inset Quotes eld \end_inset eat up \begin_inset Quotes erd \end_inset and \begin_inset Quotes eld \end_inset spit out \begin_inset Quotes erd \end_inset process is the key idea. Imagine a macro definition \family typewriter \backslash newcommand{ \backslash foo}[2]{a#1b#2c} \family default which is valid when a macro \family typewriter \backslash foo \family default appears in the context \family typewriter \backslash foo ABCD \family default . When the macro is drawn the definition is checked and the arity is compared to the number of \begin_inset Quotes eld \end_inset eaten \begin_inset Quotes erd \end_inset insets. At the beginning the latter will be zero. Because the arity of \family typewriter \backslash foo \family default is 2, the macro inset will eat up 2 insets (the \family typewriter A \family default and the \family typewriter B \family default ), hence internally the macro \family typewriter \backslash foo \family default is changed to arity 2 and \family typewriter A \family default and \family typewriter B \family default are moved into it. The visual representation of macro is that of the definition with the arguments replaced by the eaten insets. So eventually you will see \family typewriter aAbBcCD \family default on screen. \end_layout \begin_layout Standard When you change the macro definition at the position into a unary macro, e.g. \family typewriter \backslash newcommand{ \backslash foo}[1]{a#1b} \family default , the macro inset will spit out the second eaten inset, here the \family typewriter B \family default . Hence you will eventually see \family typewriter aAbBCD \family default . \end_layout \begin_layout Standard This process is done automatically, transparent to the user and in a fast way every time the macro is rendered and the definition has changed. \end_layout \begin_layout Standard If you look at the produced \SpecialChar TeX code of the \family typewriter \backslash foo ABCD \family default you will notice that it didn't change during all this eating and spitting. This is what you expect from a macro in \SpecialChar TeX . There the whole sense of command (i.e. macros) is that you keep the same \SpecialChar TeX code, independently from the macro definitio n. This approach carries this over to the \SpecialChar LyX world. \end_layout \begin_layout Subsection The implementation \end_layout \begin_layout Subsubsection MathData \end_layout \begin_layout Standard When a MathData object is drawn, more precisely when the metrics are computed, all math macros in the \family typewriter MathData \family default are processed in the way described in the previous section. If the arity of definition of a macro is changed the spitting/eating process takes place. This is implemented in \family typewriter MathData::updateMacros \family default , in a quite straight forward way. \end_layout \begin_layout Standard Some complexity comes into the game by the necessary updating of the current cursor. If the user unfolds a macro the arity practically changes to zero, hence the arguments are spit out. If the cursor was inside an argument before, it should be in the same argument after the unfolding. The same should be the case for folding. \end_layout \begin_layout Standard The metrics calculation is, by its typing, a const method, i.e. it shouldn't change the \family typewriter MathData \family default object. The macro updating though does changes of course. Technically this is true, semantically (taking the produced \SpecialChar TeX code as semantics) it is not because nothing changes by eating/spitting or folding/unfolding with the later output. To still allow these changes in \family typewriter MathData::metrics \family default a \family typewriter const_cast \family default is used. This is somewhat ugly and a cleaner solution should be found. Maybe one day the drawing and metrics will merge, then it would make sense to think about the \family typewriter const_cast \family default as well again. \end_layout \begin_layout Subsubsection Macro Table \end_layout \begin_layout Standard How does the \family typewriter MathData \family default know which macro definitions are known at its position in the buffer? During the metrics call a \family typewriter MacroContext \family default is passed around as an element of the \family typewriter MetricsInfo \family default class. This context can be asked to resolve a macro name. \end_layout \begin_layout Standard To make this possible it has to know about a position in the buffer. In fact it knows about the paragraph in the buffer, and in addition it has a \begin_inset Quotes eld \end_inset local \begin_inset Quotes erd \end_inset \family typewriter MacroTable \family default . The latter is used to also resolve macros correctly which are defined in the paragraph where the macro appears. The inset loop in the \family typewriter TextMetrics::redoParagraph \family default creates and updates the \family typewriter MacroContext \family default and the local macros in the expected way. \end_layout \begin_layout Standard All the other macros are resolved by the \family typewriter MacroContext \family default by asking the buffer directly. For this the \family typewriter MacroContext \family default , as written above, knows the paragraph it belongs to. It passes this information to the buffer (via \family typewriter Buffer::hasMacro(docstring name, Paragraph par) \family default ) and the buffer then uses the \family typewriter par.macrocontextPosition() \family default information to lookup the defined macros at the position in the map \family typewriter Buffer::pimpl->macros \family default . This maps macro names and positions to the macro definitions. which are defined at the position or before. \end_layout \begin_layout Standard The missing bit is how the buffer creates this map. This is done in the same way as in the old macro implementation, namely by the Buffer::updateMacros method which iterates over the top-level inset of the buffer. It is called from \family typewriter BufferView::processUpdateFlags \family default very often. This sounds slow, but it turned out that it is not noticable in fact. In \SpecialChar LyX 1.5 the same is done as well already. Maybe some optimisation could help though, but was not investigated. \end_layout \begin_layout Standard To support master documents there will a last lookup (if the previous lookup were not successful) by asking the master buffer. \end_layout \begin_layout Subsection File Format \end_layout \begin_layout Standard The file format concerning macros in the old macro implementation is not well defined. As described above there is a big difference between the visual semantics (what the user sees inside \SpecialChar LyX 1.5) and the latex semantics (what \SpecialChar LaTeX will make out of the document) are not the same. \end_layout \begin_layout Standard The new approach changes this for most documents (if the user does not do any dirty tricks at least) to be the same. So from the file format point of view there probably should not be any conversion needed to a new file format. \end_layout \begin_layout Standard One exception of this comes from the support for optional arguments in the new implementation. Those were not available in the old format. \end_layout \begin_layout Subsubsection Simple Macros \end_layout \begin_layout Standard Macro definitions are stored in the following way: \begin_inset listings inline false status open \begin_layout Plain Layout \backslash begin_inset FormulaMacro \end_layout \begin_layout Plain Layout \backslash newcommand{ \backslash abc}[1]{ \backslash sin \backslash left( \backslash frac{-3}{#1} \backslash right)} \end_layout \begin_layout Plain Layout \backslash end_inset \end_layout \end_inset \end_layout \begin_layout Standard The resulting \SpecialChar LaTeX code is as expected: \begin_inset listings inline false status open \begin_layout Plain Layout \backslash newcommand{ \backslash abc}[1]{ \backslash sin \backslash left( \backslash frac{-3}{#1} \backslash right)} \end_layout \end_inset \end_layout \begin_layout Subsubsection One Optional Argument \end_layout \begin_layout Standard With one optional argument the \SpecialChar LyX code looks like this: \begin_inset listings inline false status open \begin_layout Plain Layout \backslash begin_inset FormulaMacro \end_layout \begin_layout Plain Layout \backslash newcommand{ \backslash abc}[1][42]{ \backslash sin \backslash left( \backslash frac{-3}{#1} \backslash right)} \end_layout \begin_layout Plain Layout \backslash end_inset \end_layout \end_inset and the \SpecialChar LaTeX code again is the same: \begin_inset listings inline false status open \begin_layout Plain Layout \backslash newcommand{ \backslash abc}[1][42]{ \backslash sin \backslash left( \backslash frac{-3}{#1} \backslash right)} \end_layout \end_inset \end_layout \begin_layout Subsubsection Multi Optional Argument Macro \end_layout \begin_layout Standard More than one optional argument is not supported by \SpecialChar LaTeX . There are several solutions to allow them by defining some custom \family typewriter \backslash newcommand \family default , but this is not standardized. It might make sense for \SpecialChar LyX to also support those when importing, but this is not implemented. Instead the new implementation will create valid standard \SpecialChar LaTeX code by outputting what the user sees on screen in \SpecialChar LyX : \begin_inset listings inline false status open \begin_layout Plain Layout \backslash begin_inset FormulaMacro \end_layout \begin_layout Plain Layout \backslash newcommand{ \backslash xyz}[2][42][28]{ \backslash sqrt{#1}+ \backslash ln \backslash left( \backslash frac{#2}{82} \backslash right)} \end_layout \begin_layout Plain Layout \backslash end_inset \end_layout \end_inset with the \SpecialChar LaTeX code: \begin_inset listings inline false status open \begin_layout Plain Layout \backslash newcommand{ \backslash xyz}[2][42]{ \backslash sqrt{#1}+ \backslash ln \backslash left( \backslash frac{#2}{82} \backslash right)} \end_layout \end_inset When the user creates an instance of \backslash xyz without substituting the optional argument, e.g. by \begin_inset listings inline false status open \begin_layout Plain Layout \backslash xyz \end_layout \end_inset \SpecialChar LyX will create the following \SpecialChar LaTeX code when exporting to \SpecialChar LaTeX : \begin_inset listings inline false status open \begin_layout Plain Layout \backslash xyz{28} \end_layout \end_inset So the optional argument is not optional any more after export, but explicit. \end_layout \begin_layout Subsubsection \backslash def style \end_layout \begin_layout Standard Last but not least, as in the old implementation you can use \family typewriter \backslash def \family default macros, i.e. \SpecialChar TeX style definitions. They don't support optional arguments. They don't support \begin_inset Quotes eld \end_inset patterns \begin_inset Quotes erd \end_inset of the shape \family typewriter \backslash def \backslash term #1+#2{#1+#2} \family default where you can use it as in \family typewriter \backslash term 43+12 \family default . \end_layout \begin_layout Subsubsection Redefinition \end_layout \begin_layout Standard On export \SpecialChar LyX will correctly use \family typewriter \backslash newcommand \family default and \family typewriter \backslash renewcommand \family default if needed. This is not visible in the \SpecialChar LyX file format though. \end_layout \begin_layout Subsection How it looks to the user \end_layout \begin_layout Subsubsection Creation \end_layout \begin_layout Standard Macro definitions look more or less the same as in the old implementation. I.e. there is a macro definition inset showing the macro like \family typewriter \backslash foo{#1}:={a#1b} \family default . You can create i \family typewriter t \family default via the \begin_inset Quotes eld \end_inset math-macro foo 4 \begin_inset Quotes erd \end_inset to create a macro \family typewriter \backslash foo \family default with 4 parameters. \end_layout \begin_layout Standard A second way to create them is to write down the \SpecialChar LaTeX definition like \family typewriter \backslash newcommand \backslash foo{abc} \family default as plain text. Select it and press Ctrl-m. \end_layout \begin_layout Standard The last way, which is new with the new implementation, is to use the Insert/Mat h/Macro menu item. \end_layout \begin_layout Subsubsection Modification \end_layout \begin_layout Standard The are the following actions defined: \end_layout \begin_layout Standard \begin_inset Tabular \begin_inset Text \begin_layout Plain Layout Action \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Menu \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout math-macro-unfold \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout View/Unfold Math Macro \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout math-macro-fold \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout View/Fold Math Macro \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout math-macro-add-param \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Edit/Math/Macro/Append Parameter \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout math-macro-remove-param \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Edit/Math/Macro/Remove Last Parameter \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout math-macro-append-greedy-param \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Edit/Math/Macro/Append Parameter Eating From the Right \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout math-macro-make-optional \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Edit/Math/Macro/Make First Non-Optional into Optional Parameter \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout math-macro-remove-greedy-param \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Edit/Math/Macro/Remove Last Parameter Spitting Out To The Right \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout math-macro-make-nonoptional \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Edit/Math/Macro/Make Last Optional into Non-Optional Parameter \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout math-macro-add-optional-param \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Edit/Math/Macro/Insert Optional Parameter \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout math-macro-remove-optional-param \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Edit/Math/Macro/Remove Optional Parameter \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout math-macro-add-greedy-optional-param \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Edit/Math/Macro/Append Optional Parameter Eating From the Right \end_layout \end_inset \end_inset \end_layout \begin_layout Subsubsection Greedy vs. Non-Greedy \end_layout \begin_layout Standard As described above the key idea is that macros and eat up and spit out parameter s, depending on their arity. This makes them very dynamic and powerful, but at the same time adds some complexity which must be understood by the user to effectively use the macros. \end_layout \begin_layout Standard Hence if the arity is increased (i.e. another parameter is added to a macro) there are two ways to do that: if this is done greedily the macro tries to eat up another inset from the right. This is the natural way if you import a document and then start to define a macros with \SpecialChar LyX 's math macros. Then you want that the macros take the (existing) parameters from the right. \end_layout \begin_layout Standard The second case is the non-greedy use case. E.g. you want to change a macro to take another parameter because you just found out that your notation needs another index. Then you want to insert this non-greedily. All macro instances in your text should get another parameter without touching the surroundings. \end_layout \begin_layout Standard The greedy variants of the actions have the word \begin_inset Quotes eld \end_inset greedy \begin_inset Quotes erd \end_inset in their name. \end_layout \begin_layout Standard Some of the actions also take a parameter to define the position to act on in the parameter list. E.g. you can write \family typewriter math-macro-add-param 2 \family default in the mini-buffer to add a parameter at position 2. \end_layout \begin_layout Subsubsection Folding/Unfolding \end_layout \begin_layout Standard Sometimes it is desirable to switch to the \SpecialChar TeX code of a macro instance, i.e. without any substitution using the macro definition. This can be done with the fold/unfold actions. You can use the \family typewriter Ctrl-+ \family default and \family typewriter Ctrl-- \family default shortcuts for that. \end_layout \begin_layout Standard If you nest macro instances these actions will unfold from inside to the outside and the same for folding. This is supposed to replace the old list display when entering a macro. \end_layout \begin_layout Subsubsection Toolbar \end_layout \begin_layout Standard Currently there is no toolbar for math macros. Because the menu hierarchy is very deep a toolbar would make the life a lot easier. It shouldn't be hard to implement that. \end_layout \begin_layout Subsubsection More natural macro definition editing \end_layout \begin_layout Standard Instead of the described actions it would desirable to add another more natural way to edit macros. The vision is that the user can put the cursor everywhere inside of the macro definition inset which shows (already now!) the definition in the way \family typewriter \backslash name{#1}{#2}:={definition} \family default . The user should be able to use the backspace and the \family typewriter { \family default key to remove and add parameters when the cursor is in the parameter definition part. For a non-greedy macro-append one could put a small (+) button or a hungry packman \family typewriter (< \family default behind the \family typewriter {#2} \family default in front of the definition. \end_layout \begin_layout Standard For implementing this one has to customize the \family typewriter MathInsetNest \family default a lot to handle the key presses correctly, because it's probably not directly doable with \family typewriter MathInsetNest \family default in a simple way with its children insets. \end_layout \begin_layout Subsubsection Keyboard navigation \end_layout \begin_layout Standard You can jump from \family typewriter #n \family default to \family typewriter #n+1 \family default with the cursor key and conversely backwards. This navigation is not visual. I.e. the user can define macros like \family typewriter \backslash foo{#1}{#2}:={#2+#1} \family default . Then the cursor jumps first to the right and then to the left where the #1 is. This can be confusing. One could think about a visual movement mode by taking the position of the macro argument insets into account to find the next inset for the cursor keys. This should be doable. \end_layout \end_body \end_document