开发者

Use LaTeX Listings to correctly detect and syntax highlight embedded code of a different language in a script

I have scripts that have one-liners or sort scripts from other languages within them. How can I have LaTeX listings detect this and change the syntax formating language within the script? This would be especially useful for awk within bash I believe.

Bash

#!/bin/bash

echo "hello world"

R --vanilla << EOF
# Data on motor octane ratings for various gasoline blends
x <- c(88.5,87.7,83.4,86.7,87.5,91.5,88.6,100.3,
95.6,93.3,94.7,91.1,91.0,94.2,87.5,89.9,
88.3,87.6,84.3,86.7,88.2,90.8,88.3,98.8,
94.2,92.7,93.2,91.0,90.3,93.4,88.5,90.1,
89.2,88.3,85.3,87.9,88.6,90.9,89.0,96.1,
93.3,91.8,92.3,90.4,90.1,93.0,88.7,89.9,
89.8,89.6,87.4,88.9,91.2,89.3,94.4,92.7,
91.8,91.6,90.4,91.1,92.6,89.8,90.6,91.1,
90.4,89.3,89.7,90.3,91.6,90.5,93.7,92.7,
92.2,92.2,91.2,91.0,92.2,90.0,90.7)
x
length(x)
mean(x);var(x)
stem(x)
EOF

perl -n -e '
@t = split(/\t/);
%t2 = map { $_ => 1 } split(/,/,$t[1]);
$t[1] = join(",",keys %t2);
print join("\t",@t); ' knownGeneFromUCSC.txt

awk -F'\t' '{
  n = split($2, t, ","); _2 = x
  split(x, _) # use delete _ if supported
  for (i = 0; ++i <= n;)
    _[t[i]]++ || _2 = _2 ? _2 "," t[i] : t[i]
  $2 = _2 
  }-3' OFS='\t' infile

Python

#!/usr/local/bin/python
print "Hello World"
os.system("""
VAR=even;
sed -i "s/$VAR/odd/" testfile;
for i in `cat testfile` ;
do echo $i; done;
echo "now the tr command is removing the vowels";
cat testfile |tr 'aeiou' ' '
""") 

UPDATE: These are my current Listings settings in the preamble:

% This gives syntax highlighting in the python environment
\renewcommand{\lstlistlistingname}{Code Listings}
\renewcommand{\lstlistingname}{Code Listing}
\definecolor{gray}{gray}{0.5}
\definecolor{key}{rgb}{0,0.5,0}
\lstloadlanguages{Fortran,C++,C,[LaTeX]TeX,Python,bash,R, Perl}

\lstnewenvironment{python}[1][]{
  \lstset{
    language=python,
    basicstyle=\ttfamily\small,
    otherkeywords={1, 2, 3, 4, 5, 6, 7, 8 ,9 , 0, -, =, +, [, ], (, ), \{, \}, :, *, !},
    keywordstyle=\color{blue},
    stringstyle=\color{red},
    showstringspaces=false,
    emph={class, pass, in, for, while, if, is, elif, else, not, and, or,
    def, print, exec, break, continue, return},
    emphstyle=\color{black}\bfseries,
    emph={[2]True, False, None, self},
    emphstyle=[2]\color{key},
    emph={[3]from, import, as},
    emphstyle=[3]\color{blue},
    upquote=true,
    morecomment=[s]{"""}{"""},
    commentstyle=\color{gray}\slshape,
    rulesepcolor=\color{blue},#1
  }
}{}

\lstnewenvironment{bash}{%
  \lstset{%
    language=bash,
    otherkeywords={=, +, [, ], (, ), \{, \}, *},
    % bash commands from:
    %http://www.math.montana.edu/Rweb/Rhelp/00Index.html
    emph={addgroup,adduser,alias,
    ant,
    apropos,apt-get,aptitude,aspell,awk,
    basename,bash,bc,bg,break,builtin,bzip2,cal,case,cat,cd,cfdisk,chgrp,
    chkconfig,chmod,chown,chroot,cksum,clear,cmp,comm,command,continue,
    cp,cron,crontab,csplit,cut,date,dc,dd,ddrescue,declare,df,diff,diff3,
    dig,dir,dircolors,dirname,dirs,dmesg,du,echo,egrep,eject,enable,env,
    ethtool,eval,exec,exit,expand,expect,export,expr,false,fdformat,
    fdisk,fg,fgrep,file,find,fmt,fold,for,format,free,fsck,ftp,function,
    fuser,gawk,getopts,
    git,
    grep,groups,gzip,
    gunzip,
    ,hash,head,help,history,hostname,
    id,if,ifconfig,ifdown,ifup,import,install,
    java, java6, java_cur
    join,kill,killall,less,
    let,ln,local,locate,logname,logout,look,lpc,lpr,lprint,lprintd,
    lprintq,lprm,ls,lsof,make,man,mkdir,mkfifo,mkisofs,mknod,mmv,more,
    mount,mtools,mtr,mv,
    mysql,
    netstat,nice,nl,nohup,notify-send,
    noweb,noweave,
    nslookup,op,
    open,passwd,paste,pathchk,ping,pkill,popd,pr,printcap,printenv,
    printf,ps,pushd,pwd,quota,quotacheck,quotactl,ram,rcp,read,
    readarray,readonly,reboot,remsync,rename,renice,return,rev,rm,rmdir,
    rsync,scp,screen,sdiff,sed,select,seq,set,sftp,shift,shopt,shutdown,
    sleep,slocate,sort,source,split,ssh,strace,su,sudo,sum,
    svn, svn2git,
    symlink,sync,
    tail,tar,tee,test,time,times,top,touch,tr,traceroute,trap,true,
    tsort,tty,type,ulimit,umask,umount,unalias,uname,unexpand,uniq,
    units,
    unrar,
    unset,unshar,until,useradd,usermod,users,uudecode,uuencode,
    vdir,vi,vmstat,watch,wc,Wget,whereis,which,while,who,whoami,write,
    zcat},
    breaklines=true,
    keywordstyle=\color{blue},
    stringstyle=\color{red},
    emphstyle=\color{black}\bfseries,
    commentstyle=\color{gray}\slshape,
  }
}{}

\lstnewenvironment{latexCode}[1]{\lstset{language=[latex]tex} \lstset{#1}}{}

\lstnewenvironment{Rcode}{
  \lstset{%
    language={R},
    basicstyle=\small,                  % print whole listing small
    keywordstyle=\color{black},         % style for keyword
    % Function list from:
    % http://www.math.montana.edu/Rweb/Rhelp/00Index.html
    emph={abbreviate, abline,
    abs, acos, acosh, all, all.names,
    all.vars, anova, anova.glm, anova.lm, any,
    aperm, append, apply, approx, approxfun,
    apropos, Arg, args, Arithmetic, array,
    arrows, as.array, as.call, as.character, as.complex,
    as.data.frame, as.double, as.expression, as.factor, asin,
    asinh, as.integer, as.list, as.logical, as.matrix,
    as.na, as.name, as.null, as.numeric, as.ordered,
    as.qr, as.real, assign, as.ts, as.vector,
    atan, atan2, atanh, attach, attr,
    attributes, autoload, .AutoloadEnv, axis, backsolve,
    barplot, beta, binomial, box, boxplot,
    boxplot.stats, break, browser, bw.bcv, bw.sj,
    bw.ucv, bxp, c, .C, call,
    cat, cbind, ceiling, character, charmatch,
    chisq.test, chol, chol2inv, choose, class,
    class<-, codes, coef, coefficients, coefficients.glm,
    coefficients.lm, co.intervals, col, colnames, colors,
    colours, Comparison, complete.cases, complex, Conj,
    contour, contrasts, contr.helmert, contr.poly, contr.sum,
    contr.treatment, convolve, cooks.distance, coplot, cor,
    cos, cosh, count.fields, cov, covratio,
    crossprod, cummax, cummin, cumprod, cumsum,
    curve, cut, D, data, data.class,
    data.entry, dataentry, data.frame, data.matrix, dbeta,
    dbinom, dcauchy, dchisq, de, debug,
    delay, demo, de.ncols, density, deparse,
    de.restore, deriv, deriv.default, deriv.formula, de.setup,
    detach, deviance, deviance.glm, deviance.lm, device,
    Devices, dev.off, dexp, df, dfbetas,
    dffits, df.residual, df.residual.glm, df.residual.lm, dgamma,
    dgeom, dget, dhyper, diag, diff,
    digamma, dim, dim<-, dimnames, dimnames<-,
    dlnorm, dlogis, dnbinom, dnchisq, dnorm,
    do.call, dotplot, double, dpois, dput,
    drop, dt, dump, dunif, duplicated,
    dweibull, dyn.load, edit, effects.glm, effects.lm,
    eigen, else, emacs, end, environment,
    environment<-, eval, exists, exp, expression,
    Extract, factor, family, family.glm, fft,
    finite, fitted, fitted.values, fitted.values.glm, fitted.values.lm,
    fivenum, fix, floor, for, formals,
    format, formatC, format.default, formula.default, formula.formula,
    formula.terms, .Fortran, frame, frequency, function,
    Gamma, gamma, gaussian, gc, gcinfo,
    get, getenv, gl, glm, glm.control,
    glm.fit, .GlobalEnv, graphics.off, gray, grep,
    grid, gsub, hat, heat.colors, help,
    hist, hsv, identify, if, ifelse,
    Im, image, \%in\%, influence.measures, inherits,
    integer, interactive, .Internal, inverse.gaussian, invisible,
    invisible, IQR, is.array, is.atomic, is.call,
    is.character, is.complex, is.data.frame, is.double, is.environment,
    is.expression, is.factor, is.function, is.integer, is.language,
    is.list, is.loaded, is.logical, is.matrix, is.na,
    is.name, is.null, is.numeric, is.ordered, is.qr,
    is.real, is.recursive, is.single, is.ts, is.unordered,
    is.vector, lapply, lbeta, lchoose, legend,
    length, LETTERS, letters, levels, levels<-,
    lgamma, .lib.loc, .Library, library, library.dynam,
    license, lines, lines.default, list, lm,
    lm.fit, lm.influence, lm.wfit, load, locator,
    log, log10, log2, Logic, logical,
    lower.tri, lowess, ls, ls.diag, lsfit,
    lsf.str, ls.print, ls.str, .Machine, Machine,
    machine, macintosh, mad, match, match.arg,
    match.call, matlines, mat.or.vec, matplot, matpoints,
    matrix, max, mean, median, menu,
    methods, min, missing, Mod, mode,
    mode<-, model.frame, model.frame.default, model.matrix, model.matrix.default,
    month.abb, month.name, mtext, mvfft, NA,
    na.action, na.action.default, na.fail, names, na.omit,
    nargs, nchar, NCOL, ncol, next,
    NextMethod, nextn, nlevels, nlm, [.noquote,
    noquote, NROW, nrow, NULL, numeric,
    objects, on.exit, optimize, options, order,
    ordered, outer, pairs, palette, par,
    parse, paste, pbeta, pbinom, pcauchy,
    pchisq, pentagamma, pexp, pf, pgamma,
    pgeom, phyper, pi, pictex, piechart,
    plnorm, plogis, plot, plot.default, plot.density,
    plot.ts, plot.xy, pmatch, pmax, pmin,
    pnbinom, pnchisq, pnorm, points, points.default,
    poisson, polygon, polyroot, postscript, ppoints,
    ppois, pretty, print, print.anova.glm, print.anova.lm,
    print.data.frame, print.default, print.density, print.formula, print.glm,
    print.lm, print.noquote, print.plot, print.summary.glm, print.summary.lm,
    print.terms, print.ts, proc.time, prod, prompt,
    prompt.default, prop.test, provide, .Provided, ps.options,
    pt, punif, pweibull, q, qbeta,
    qbinom, qcauchy, qchisq, qexp, qf,
    qgamma, qgeom, qhyper, qlnorm, qlogis,
    qnbinom, qnchisq, qnorm, qpois, qqline,
    qqnorm, qqplot, qr, qr.coef, qr.fitted,
    qr.Q, qr.qty, qr.qy, qr.R, qr.resid,
    qr.solve, qr.X, qt, quantile, quasi,
    quit, qunif, quote, qweibull, rainbow,
    .Random.seed, range, rank, rbeta, rbind,
    rbinom, rcauchy, rchisq, Re, readline,
    read.table, real, rect, remove, rep,
    repeat, replace, require, resid, residuals,
    residuals.glm, residuals.lm, return, rev, rexp,
    rf, rgamma, rgb, rgeom, rhyper,
    RLIBS, rlnorm, rlogis, rm, rnbinom,
    rnchisq, rnorm, round, row, row.names,
    rownames, rpois, rstudent, rt, runif,
    rweibull, sample, sapply, save, save.plot,
    scale, scan, sd, segments, seq,
    sequence, sign, signif, sin, sinh,
    sink, solve, solve.qr, sort, source,
    spline, splinefun, split, sqrt, start,
    stem, stop, storage.mode, storage.mode<-, str,
    str.data.frame, str.default, strheight, stripplot, strsplit,
    structure, strwidth, sub, Subscript, substitute,
    substr, substring, sum, summary, summary.glm,
    summary.lm, svd, sweep, switch, symbol.C,
    symbol.For, symnum, sys.call, sys.calls, sys.frame,
    sys.frames, sys.function, sys.nframe, sys.on.exit, sys.parent,
    sys.parents, system, system.date, system.time, t,
    table, tabulate, tan, tanh, tapply,
    tempfile, terms, terms.default, terms.formula, terms.terms,
    terrain.colors, tetragamma, text, time, title,
    topo.colors, trace, traceback, trigamma, trunc,
    ts, tsp, t.test, typeof, unclass,
    undebug, unique, uniroot, unlink, unlist,
    untrace, update, update.formula, update.glm, update.lm,
    upper.tri, UseMethod, var, vector, Version,
    version, vi, warning, weighted.mean, weights.lm,
    while, window, windows, write, x11,
    xedit, xemacs, xinch, xor, xy.coords,
    yinch},                             % define a list of word to emphasis
    stringstyle=\color{red},
    emphstyle=\color{black}\bfseries,   % define the way to emphase
    showspaces=false,                   % show the space in code, or not
    stringstyle=\ttfamily,              % style of the string (like "hello word")
    showstringspaces=false,             % show the space in string, on not #1
    commentstyle=\color{gray}\slshape,
    tabsize=2,                          % sets default tabsize to 2 spaces
    breaklines=true,                    % sets automatic line breaking
    breakatwhitespace=false,            % sets if automatic breaks should only happen at whitespace
  }
}{}

\lstnewenvironment{Perl}{
  \lstset{%
    language={perl},
    basicstyle=\small,                  % print whole listing small
    keywordstyle=\color{black},         % style for keyword
    emph={% From http://www.sdsc.edu/~moreland/courses/IntroPerl/docs/manual/pod/perlfunc.html
    -X, run, abs, absolute, accept, accept, alarm, schedule, atan2, 
    arctangent, bind, binds, binmode, prepare, bless, create, caller, 
    get, chdir, change, chmod, changes, chomp, remove, chop, remove, 
    chown, change, chr, get, chroot, make, close, close, closedir, close, 
    connect, connect, continue, optional, cos, cosine, crypt, one-way, 
    dbmclose, breaks, dbmopen, create, defined, test, delete, deletes, 
    die, raise, do, turn, dump, create, each, retrieve, endgrent, be, 
    endhostent, be, endnetent, be, endprotoent, be, endpwent, be, 
    endservent, be, eof, test, eval, catch, exec, abandon, exists, test, 
    exit, terminate, exp, raise, fcntl, file, fileno, return, flock, 
    lock, fork, create, format, declare, formline, internal, getc, get, 
    getgrent, get, getgrgid, get, getgrnam, get, gethostbyaddr, get, 
    gethostbyname, get, gethostent, get, getlogin, return, getnetbyaddr, 
    get, getnetbyname, get, getnetent, get, getpeername, find, getpgrp, 
    get, getppid, get, getpriority, get, getprotobyname, get, 
    getprotobynumber, get, getprotoent, get, getpwent, get, getpwnam, 
    get, getpwuid, get, getservbyname, get, getservbyport, get, 
    getservent, get, getsockname, retrieve, getsockopt, get, glob, 
    expand, gmtime, convert, goto, create, grep, locate, hex, convert, 
    import, patch, int, get, ioctl, system-dependent, join, join, keys, 
    retrieve, kill, send, last, exit, lc, return, lcfirst, return, 
    length, return, link, create, listen, register, local, create, 
    localtime, convert, log, retrieve, lstat, stat, m//, match, map, 
    apply, mkdir, create, msgctl, SysV, msgget, get, msgrcv, receive, 
    msgsnd, send, my, declare, next, iterate, no, unimport, oct, convert, 
    open, open, opendir, open, ord, find, pack, convert, package, 
    declare, pipe, open, pop, remove, pos, find, print, output, printf, 
    output, prototype, get, push, append, q/STRING/, singly, qq/STRING/, 
    doubly, quotemeta, quote, qw/STRING/, quote, qx/STRING/, backquote, 
    rand, retrieve, read, fixed-length, readdir, get, readlink, 
    determine, recv, receive, redo, start, ref, find, rename, change, 
    require, load, reset, clear, return, get, reverse, flip, rewinddir, 
    reset, rindex, right-to-left, rmdir, remove, s///, replace, scalar, 
    force, seek, reposition, seekdir, reposition, select, reset, semctl, 
    SysV, semget, get, semop, SysV, send, send, setgrent, prepare, 
    sethostent, prepare, setnetent, prepare, setpgrp, set, setpriority, 
    set, setprotoent, prepare, setpwent, prepare, setservent, prepare, 
    setsockopt, set, shift, remove, shmctl, SysV, shmget, get, shmread, 
    read, shmwrite, write, shutdown, close, sin, return, sleep, block, 
    socket, create, socketpair, create, sort, sort, splice, add, split, 
    split, sprintf, formatted, sqrt, square, srand, seed, stat, get, 
    study, optimize, sub, declare, substr, get, symlink, create, syscall, 
    execute, sysread, fixed-length, system, run, syswrite, fixed-length, 
    tell, get, telldir, get, tie, bind, time, return, times, return, 
    tr///, transliterate, truncate, shorten, uc, return, ucfirst, return, 
    umask, set, undef, remove, unlink, remove, unpack, convert, unshift, 
    prepend, untie, break, use, load, utime, set, values, return, vec, 
    test, wait, wait, waitpid, wait, wantarray, get, warn, print, write, 
    print, y///, transliterate},        % define a list of word to emphasis
    stringstyle=\color{red},
    emphstyle=\color{black}\bfseries,   % define the way to emphase
    showspaces=false,                   % show the space in code, or not
    stringstyle=\ttfamily,              % style of the string (like "hello word")
    showstringspaces=false,             % show the space in string, on not #1
    commentstyle=\color{gray}\slshape,
    tabsize=2,                          % sets default tabsize to 2 spaces
    breaklines=true,                    % sets automatic line breaking
    breakatwhitespace=false,            % sets if automatic breaks should only happen at whitespace
  }
}{}



\lstnewenvironment{plaintext}{
  \lstset{
    tabsize=2,                          % sets default tabsize to 2 spaces
    breaklines=true,                    % sets automatic line breaking
    breakatwhitespace=false,            % sets if automatic b开发者_开发技巧reaks should only happen at whitespace
    basicstyle=\normalfont\ttfamily,
  }
}{}


It is almost certainly easier to modify the Bash/Python highlighters than to write a context-sensitive highlighter. I'm guessing that just adding the keywords to the other highlighters should give acceptable results.

Modifying Pygments doesn't look too difficult, from Pygments' Write your own lexer documentation.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜