emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
From: "Eric Schulte" <schulte.eric@gmail.com>
To: Francesco Pizzolante <fpz@missioncriticalit.com>
Cc: mailing-list-org-mode <emacs-orgmode@gnu.org>
Subject: Re: [babel] References to variable block names
Date: Thu, 13 Jan 2011 09:50:19 -0700	[thread overview]
Message-ID: <87bp3kd9ys.fsf@gmail.com> (raw)
In-Reply-To: <874o9dmcdp.fsf@mundaneum.com> (Francesco Pizzolante's message of "Thu, 13 Jan 2011 09:33:22 +0100")

Francesco Pizzolante <fpz@missioncriticalit.com> writes:

> Dear Eric,
>
> Thanks for your answer.
>
>> 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

      reply	other threads:[~2011-01-13 16:50 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-01-12 11:40 [babel] References to variable block names Francesco Pizzolante
2011-01-12 16:32 ` Eric Schulte
     [not found]   ` <87y66qrsko.fsf-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2011-01-13  8:33     ` Francesco Pizzolante
2011-01-13 16:50       ` Eric Schulte [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.orgmode.org/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87bp3kd9ys.fsf@gmail.com \
    --to=schulte.eric@gmail.com \
    --cc=emacs-orgmode@gnu.org \
    --cc=fpz@missioncriticalit.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).