emacs-orgmode
[Top][All Lists]

## Re: [Orgmode] [babel] References to variable block names

 From: Eric Schulte Subject: Re: [Orgmode] [babel] References to variable block names Date: Thu, 13 Jan 2011 09:50:19 -0700 User-agent: Gnus/5.13 (Gnus v5.13) Emacs/24.0.50 (gnu/linux)

Francesco Pizzolante <address@hidden> writes:

> Dear Eric,
>
>
>> In your example the cv source block only seems to have a single variable
>> specified with a :var header argument (namely v-jobtitle), e.g.
>>
>> #+srcname: cv
>> #+begin_src latex :noweb yes :var v-jobtitle="Software Engineer"
>> ...
>> #+end_src
>>
>> however your example noweb reference uses 4 variables.  You will need to
>> update the cv source block so that each variable is given a header
>> argument.
>>
>> #+srcname: cv
>> #+headers: :var v-firstname="Alex" :var v-familyname="Pizzo"
>> #+headers: :var v-jobtitle="Project Manager" :var employee="alex"
>> #+begin_src latex :noweb yes :var v-jobtitle="Software Engineer"
>> ...
>> #+end_src
>
> Well, the variable replacement works even if I do not specify the variables in
> a header argument. It seems to work like a simple string replace for each
> 'variable="value"' parameter in the noweb reference.
>
> When I write this:
>
> <<cv(v-firstname="Albert")>>
>
> When I tangle/evaluate the code, it replaces any occurrence of "v-firstname"
> in the cv source code by "Albert" even if the variable is not given a header
> argument...
>
> Seems like the header argument is "just" used to give a default value for the
> replacement.
>
> Is this the expected behavior?
>

Hmm, well it is not what I would have expected :)

However I suppose this behavior does make sense, in effect placing
variables in the call line e.g.

#+call: cv(v-firstname="Alex",v-familyname="Pizzo",v-jobtitle="Project
Manager",employee="alex")

Is fully equivalent to the following alternate syntax

#+call: cv[:var v-firstname="Alex" :var v-familyname="Pizzo" :var
v-jobtitle="Project Manager" :var employee="alex"]()

which simply applies the series of variable arguments to the original
code block, so yes, I suppose given the semantics of the call line
(which I hadn't worked out fully previously) this is the expected
behavior.

>
>
>> Then ensure that you can call the cv function using a call line, e.g.
>>
>> #+call: cv(v-firstname="Alex",v-familyname="Pizzo",v-jobtitle="Project
>> Manager",employee="alex")
>>
>> Once that is working then the noweb reference should work as well.
>
> I tried what you say, but it seems that a variable in a noweb reference does
> not get replaced by its value. From my point of view, it seems that:
>
> - either, the noweb references are replaced before the variables get replaced
>   by their values;
>

I believe you've put your finger on the issue, we are most likely
replacing the noweb references before the variables are replaced in the
code block, as an example please see the following...

#+source: replaced-first
#+begin_src latex
\begin{itemize}
\item first
\item data
\item third
\end{itemize}
#+end_src

#+begin_src latex :var data="second" :noweb yes
\section{ordinals}
\label{sec:ordinals}
<<replaced-first>>
#+end_src

in which calling org-babel-expand-src-block' C-c C-v v on the second
code block results in

\section{ordinals}
\label{sec:ordinals}
\begin{itemize}
\item first
\item second
\item third
\end{itemize}

>
> - or, the variable replacement does not work in noweb references.
>
> Here's a shorter example where, whatever I try, I keep getting the Profile
> section empty:
>

I see now what you are trying to do, replacing variable names embedded
in noweb references is tricky, and I see how it is useful in this
example, but I'm afraid it is not something that we support.  The
application of a variable to a code block body is language-dependent,
and is expected to have it's effects limited to "code" rather than to
"meta-information" as you have tried in your example below.

maybe, instead of the structure below, you could change your cv code
block to the following (e.g. resolve the profile inside the header
arguments, where we expect manipulation of block-level objects).

#+srcname: cv
#+begin_src latex :noweb yes :var employee-profile=profile-alex
\documentclass{mycvclass}
\usepackage[utf8x]{inputenc}

\begin{document}

\section{Profile}
employee-profile

\end{document}
#+end_src

also, arbitrary elisp is allowed in variable assignments, so you have
much freedom for manipulation in that regard.

Hope this Helps -- Eric

>
> * Alex
>
> #+call: cv(employee="alex")
>
> #+srcname: cv-alex
> #+begin_src latex :noweb yes :tangle alex.tex
> <<cv(employee="alex")>>
> #+end_src
>
> ** Profile
>
> #+srcname: profile-alex
> #+begin_src latex
> Software engineering expert.
> #+end_src
>
> * Composed CV
> #+srcname: cv
> #+begin_src latex :noweb yes :var employee="alex"
> \documentclass{mycvclass}
> \usepackage[utf8x]{inputenc}
>
> \begin{document}
>
> \section{Profile}
> <<profile-employee>>
>
> \end{document}
> #+end_src
>
> Any help is welcome.
>
> Thanks,
> Francesco

`