Take the 2-minute tour ×
TeX - LaTeX Stack Exchange is a question and answer site for users of TeX, LaTeX, ConTeXt, and related typesetting systems. It's 100% free, no registration required.

I am writing my reports which need to reference complete *.java files with latex. I am using the Texlipse Eclipse plugin to do the editing.

Right now I am referencing the complete path to each *.java file within the *.tex file like so:

\subsection*{Foo-class}
\lstinputlisting{/home/pathtoexlipse/workspace/Foo.java}

Since we are collaborating on the source files and the documentation with help of a VCS, it would be nice to have a means to reference a relative path within the latex document.

The folder structure within the project-file always looks like this:

Project_Folder/
|src/
|---Foo.java
|---Bar.java
|latex_documentation/
|--mydocument.tex

But since editing takes place under different systems, where the project-files are located at different absolute path on the filesystem, it would be nice to have a possibility to just reference the relative path when invoking \lstinputlisting.

Also, it would be great, if it would be possible to automatically parse a directory for all *.java files, and automatically include them within the \lstinputlisting.

Is there a means in latex to achieve these desired features?

share|improve this question
    
Please wait, I am preparing the answer. :-) –  xport Dec 5 '10 at 2:45
    
great, thank you :-) –  elementz Dec 5 '10 at 2:58
    
You can use \write18 to execute commands on the system, but this is generally considered unsafe and thus disabled by default. You can enable it by passing arguments like -shell-escape to pdflatex. I think it's better to run something outside of latex to generate the file listing that you can parse in TeX. –  TH. Dec 5 '10 at 6:41
    
@elements, @TH, I have written the application in c#, please see the last part of my answer. Use Mono .NET runtime to compile and run the application. –  xport Dec 5 '10 at 14:18
    
I don’t understand the problem. TeX works just fine with relative paths. Just use something like this: \lstinputlisting{Foo.java}. –  Konrad Rudolph Dec 5 '10 at 15:07

1 Answer 1

Create a batch file

If you are working on a non-Windows computer, please adapt the following batch.

rem batch.bat takes 2 mandatory arguments.
rem %1 represents your java code directory path.
rem %2 represents main TeX input file name (aka jobname).
set curdir=%CD%
cd %1
dir /b *.java > %curdir%\%2.xport

For the sake of simplicity, save this batch in the same directory in which your main TeX input file exists. In your case, save it in latex_documentation directory.

If you want to reuse this batch for other projects, you should set the system variable PATH to a directory in which this batch exists.

Main input file

\documentclass{article}
\usepackage{listings,xcolor}
\usepackage[a4paper,margin=2cm]{geometry}
\usepackage[colorlinks]{hyperref}


{
\catcode`\^0
\catcode`\\12
^gdef^dirsep{\}
}

\lstset
{
    language=Java,
    frame=single,
    breaklines=true,
    basicstyle=\small\tt,
    keywordstyle=\color{blue}\sf,
    identifierstyle=\color{magenta},
    commentstyle=\color{cyan},
    backgroundcolor=\color{yellow!5}
}

\newcount\TotalFiles
\newread\myfile
\newcommand\ImportAllSourceCodes
{%
    \immediate\write18{batch ..\dirsep src \jobname}% edit . to any directory in which the code exist.
    %\newread\myfile% should not be in a macro
    \immediate\openin\myfile=\jobname.xport\relax
    %\newcount\TotalFiles% should not be in a macro
    \TotalFiles=0
    \loop
        \read\myfile to \mydata
        \unless\ifeof\myfile
            \section\mydata
            \lstinputlisting[caption={\href{\mydata}{\mydata}}]{"../src/\mydata"}\newpage% also edit . here.
            \advance \TotalFiles by 1
    \repeat
    \immediate\closein\myfile
}


\begin{document}
\ImportAllSourceCodes
There are \the\TotalFiles\ files in total.
\end{document}

DON'T forget to pass -enable-write18 to TeX compiler!

The trick, to escape \, is taken from SamB's answer

{
\catcode`\^0
\catcode`\\12
^gdef^dirsep{\}
}
share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.