This is a long post, but quite exciting to anyone who uses or wants to improve literate programming with Lyx.
Along with using a literate module instead of a literate class (attached), I've got a suggestion for an alternate code scrap definition. Instead of using LatexType Paragraph with LabelType Static, (which requires literal <<label>>= and @) I suggest these changes: LatexType Environment LatextName CodeScrap LabelType Manual It means that the first line which normally contains: <<scrap-name>>= will be the environment's label, shown in a different colour and we can do without the << >>= because it will still have semantic meaning with Lyx as the label. So far, the Latex would come out like this: \begin{CodeScrap} [{scrap-name}] int x=2; int y=3; \end{CodeScrap} Which is not right, but some sed can turn: \begin{CodeScrap}\n[{scrap-name}] into \n<<scrap-name>>= and turn \end{CodeScrap} into @ before we pass to notangle or noweave. Such sed is: sed -e '/\\begin{xdummy}/{s/^.*//;n; s/^\[{/<</;s/}\] *$/>>=/;};/\\end{xdummy}/s/^.*/@\n/' Further-more, we can use optional non-label text on the same line as the label to contain a cross-reference definition such as would be used by: \nextchunklabel{LABEL-NAME} This means that to add a cross-reference label to a code chunk you would: 1. select "Scrap" from the drop-down 2. type in the scrap name 3. press space 3a. press space again and type the xref label 4. press ctrl enter and start typeing code. just miss out step 3a if you don't want a cross-reference label. This sed will do all of that (makes use of the hold space to detect the CodeScrap environment): sed -e '/\\begin{CodeScrap}/{h;s/^.*//};/\\end{CodeScrap}/s/^.*/@\n/; /^\[{/{ x;/\\begin{CodeScrap}/{x s/^\[{/<</; s/^\(.* *}\]\) *\([^ ].*\)/\\nextchunklabel{\2}\n\1/ s/ *}\] */>>=/ x} x }' It converted this Lyx (CodeScrap environment): --8<-----8<-----8<-----8<-----8<--- something() start-of-something int something() { int x=2; int y=3; } something_else #warning I'm bored --8<-----8<-----8<-----8<-----8<--- into this latex --8<-----8<-----8<-----8<-----8<--- \nextchunklabel{start-of-something} <<something()>>= int something() { int x=2; int y=3; } <<something_else>>= #warning I'm bored @ --8<-----8<-----8<-----8<-----8<--- Which is spot on! I wish that a module file could define the conversion filter. The attached module file says: OutputType literate it would be good if there was also: OutputFilter: sed -e .... which defines a filter which is used to produce the specified output type. Sam
#\DeclareLyXModule[noweb.sty]{Noweb} #DescriptionBegin #Adds \usepackage{noweb} to your document, along with the Scrap style. #Also fixes the CharStyle:Code to work with noweb, redefining nowebs #\code command to \nwcode (if you need it). #DescriptionEnd #use this filter on the output before passing to notangle or noweave: # sed -e '/\\begin{CodeScrap}/{h;s/^.*//};/\\end{CodeScrap}/s/^.*/@\n/;/^\[{/{x;/\\begin{CodeScrap}/{x;s/^\[{/<</;s/^\(.* *}\]\) *\([^ ].*\)/\\nextchunklabel{\2}\n\1/;s/ *}\] */>>=/;x};x}' Format 11 OutputType literate AddToPreamble \usepackage{noweb} % noweb breaks code command \newcommand{\nwcode}{\code} \renewcommand{\code}[1]{\texttt{#1}} EndPreamble Style Scrap Margin First_Dynamic LatexType Environment LatexName CodeScrap NewLine 0 LeftMargin MMM ParSep 0.4 TopSep 0.4 BottomSep 0.4 ItemSep 0.4 Align Left AlignPossible Block,Left FreeSpacing 1 PassThru 1 LabelType Manual LabelFont Color magenta EndFont TextFont Color latex Family Typewriter EndFont End