> It seems this could be helpful for me too. I just didn't understand so
> far how to do a thing of this kind. .-(
> So, would you mind to post this lyx-shortcut (and the latex commands)
> here? Thanks
I post all I have done.
There are still some undetected bugs, but it works on and decent  *niix 
machine. cygwin, I don't know.

=====================================
In .lyx/layouts/Mystuff.inc
====================================
# Cpp code layout
Style GGGcpp
  LatexType             Environment
  LatexName             KODcpp

  ParSkip               0.4
  ParSep                                0.4
  TopSep                0.4
  Align                 Left
  AlignPossible         Left
  LabelType            Top_Environment
  LabelString    "C++ kod"
  OptionalArgs          1

  # label font definition
  LabelFont 
    Series              Bold
  EndFont
End
=====================================


In  .lyx/external_templates
========================================
Template CppKod
        GuiName "[C++ $$Basename]"
        HelpText
                Snyggar till C++ kod
        HelpTextEnd
        FileFilter "*"
        ViewCommand "nedit $$FName"
        EditCommand "nedit $$FName"
        AutomaticProduction true
        Format LaTeX
                Product "{\\small \\input{$$FName.tex} }"
                UpdateCommand "highlight -A -L -t 4 -I -f -r -q $$FName -o 
$$FNa
me.tex"
                UpdateResult "$$FName.tex"
        FormatEnd
TemplateEnd

=========================================
In .lyx/bin/Mystuff.bind

\bind "M-g p c" "layout GGGcpp"

================================0
The C++ code is attached at the end.

To use all of this, I run the command

lyx -e latex PC.lyx && LyX2LaTeX2highlight2LaTeX PC.tex && latex 
PC.tex && latex PC.tex && dvips -o PC.ps PC.dvi

Be aware of the fact that sometimes LyX does ugly things!! Real ugly things.
It cut's of lines in my code.
For example
cout<<a<<endl<<b<<endl<<c<<endl<<d;

might be cut into two lines, and then all is lost.
WHY is LyX doing this to me??? I don't get it, perhaps some LyX guru knows.

Please respond with improvements.

Here is the C++ code that I use for the LyX2LaTeX2hightlight2LaTeX program
It's ugly, but it works. There are still a few bugs (undetected c++ code that 
doesn't transforms into something nice), like 
#include  transforms into \#include, but I'll fix that soon.
====================================

/*Converts C++ (or other languages) code that is written in my special
  cpp (or other language) environment in LyX, then exported to*/
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <vector>
#include <string>
using namespace std;

// ending should NOT include a dot.

int main(int argc, char* argv[])
{
        if (argc!=2) {
                cout<<"Usage:   "<<argv[0]<<"   latex_fil.tex"<<endl<<endl;
                return 0;
        }
        
        bool codemode=false; // found code?
        string line;
        string texline;
        string tmp="/tmp/.Big_secret_I_love_emacs_and_I_hate_vim.cpp";
        string tmptex=tmp+".tex";
        string sed_command =  "sed -i \'s/{}``/\"/g\' "+tmp+
                        "; cat "+tmp+" | tr -s \"\'\"  \\\" 
>/tmp/.no_not_really ; "+
                        " mv /tmp/.no_not_really "+tmp+
                        "; sed -i \'s/{}//g\' "+tmp+
                        "; sed -i \'s/\\\\{/{/g\' "+tmp+"; sed -i 
\'s/\\\\}/}/g\' "+tmp+
                        "; sed -i \'s/\\\\_/ /g\' "+tmp+ "; sed -i \'s/~/ /g\' 
"+tmp +
                        "; sed -i \'s/\\\\textasciitilde{}/~/g\' "+tmp+
                        "; sed -i \'s/\\\\textbackslash{}/\\\\/g\' "+tmp+
                        "; sed -i \'s/\\\\,{}//g\' "+tmp+
                        "; sed -i \'s/\\\\,//g\' "+tmp+
                        "; sed -i \'s/\\\\&/\\&/g\' "+tmp+
                        "; sed -i \'s/{\\[}/\\[/g\' "+tmp+
                        "; sed -i \'s/{]}/]/g\' "+tmp+
                        "; sed -i \'s/{\\*}/\\*/g\' "+tmp;
                        
        string command="highlight -A -L -t 4 -I -f -r -q -i "+tmp+" -o "+tmptex;
        
        vector<string> source; 
        vector<string> latex_out; // the resulting latex file
        string codefile;
        ofstream codefout;
        ifstream codefin;
        ifstream fin(argv[1]);
        if (!fin.is_open())
        {
                cout<<"Could not open the file "<<argv[1]<<endl<<endl;
                return -1;
        }
        cout<<"   Opening "<<argv[1]<<endl;
        while (getline(fin,line))
        {
                if (line!="\\begin{KODcpp}" && line!= "\\end{KODcpp}")
                {
                        if (!codemode)
                                latex_out.push_back(line);
                        else
                        {
                                // write to the file
                                if (line[line.size()-1]=='\\' && 
line[line.size()-2]=='\\')
                                        line=line.substr(0,line.size()-2);
                                codefout<<line<<endl;
                        }
                }
                else
                {
                        if (!codemode) 
                        { // open file and write
                                codefout.open(tmp.c_str());
                                if (!codefout.is_open())
                                {
                                        cout<<"ERROR: couldn't open "<<tmp<<" 
for writing"<<endl;
                                }
                                latex_out.push_back("\\begin{KODcpp}"); 
                                codemode=true;
                        }
                        else
                        { // close file and run highlight and then insert it
                                codefout.close();
                                codemode=false;
                                system(sed_command.c_str()); // remove special 
chars.
                                system(command.c_str());
                                cout<<sed_command<<endl;
                                codefin.open(tmptex.c_str());
                                if (!codefin.is_open())
                                {
                                        cout<<"ERROR: couldn't open 
"<<tmptex<<" for reading"<<endl;
                                }
                                while (getline(codefin,texline))
                                {
                                        latex_out.push_back(texline);
                                }
                                codefin.close();
                                codefin.clear();
                                latex_out.push_back("\\end{KODcpp}");
                        }
                }
                
        }
        fin.close();
        
        ofstream fout(argv[1]);
        if (!fout.is_open())
        {
                cout<<"Could not open the file "<<argv[1]<<endl<<endl;
                return -1;
        }
        cout<<"    Writing "<<argv[1]<<endl;
        for (unsigned int i=0;i<latex_out.size();i++)
                fout<<latex_out[i]<<endl;
        fout.close();
        return 0;
}

Reply via email to