On 27.07.08, Steve Litt wrote:
> On Sunday 27 July 2008 17:09, Steve Litt wrote:
> > ...
> > if I create and use two LyX styles, Code1 and Code2, each of them
> > with CopyStyle LyX-Code, then on conversion to PDF I get the following
> > error message:
> >
> > LaXeX Error: Command \lyxcode already defined
> >
> > I can use all Code1, or all Code2, or all LyX-Code, but if I have any two
> > of them in the document, I get an error like described above.
...
> > Is there a simple way I can use CopyStyle with LyX-Code and not get this
> > error?

Yes. Overwrite the Preamble definiton by defining a replacement (maybe
empty) in your copy.

> I found a fix I can use locally, and a fix that could be made with the LyX 
> distribution. Let me start with the latter...

> LyX-Code is defined in lyxdir/layouts/lyxmacros.inc thusly:

> Style LyX-Code
...
>       Preamble
...
>       EndPreamble
...
> End

> Notice that the LaTeX environment, lyxcode, is defined within the LyX 
> environment definition, so if LyX-Code is mentioned twice, \lyxcode is 
> defined twice, which is an error.

No.

If you use LyX-Code n times (with n = 1, ..., \infty) in your
document, exactly one Preamble code is inserted in the latex preamble.

Iy you do not use LyX-Code (i.e. n=0), the Preamble latex code is not
used.

> To fix the problem, the developers could remove everything from Preamble to 
> EndPreamble in the LyX-Code definition, and put it after the "Format 4" and 
> before any LyX style definitions. 

In this case, every document that used this layout will have the \lyxcode
definition in the latex preamble. As most documents do not use LyX-Code,
this is not desired.

> It's nice and modular to put the LaTeX definition inside the LyX
> definition, but doing so greatly reduces the value of CopyStyle, so I'd
> recommend against it.

It also produces cleaner LaTeX sources, so I want it to stay.

All you have to remember is that the Styles that define their own
preamble need special care when copied with CopyStyle (i.e. a new
Preamble definition).

> In other words, I copied and pasted \lyxcode to \litt_lyxcode within my
> layout file, and copied and pasted LyX-Code (minus the
> Preamble/EndPreamble section) to litt_LyX-Code within my layout file,
> and then did CopyStyle on litt_LyX-Code. It worked perfectly!

If you need the lyxcode definition in several Styles, you can:

1. Copy the Preamble section from the original LyXCode to your layout
   file (as general Preamble code).
   
2. Redefine LyXCode:

   Style LyXCode
      Preamble
      EndPreamble
      
3. Copy the redefined one, e.g.

   Style MyLyXCode
      CopyStyle LyXCode
      LatexName  \mycode
      Preamble
        \newcommand{\mycode}{Hi world!\\ \lyxcode}
      EndPreamble
   End
   
This is Untested, but you should get the general idea!

Günter

Reply via email to