Hi, I think the below does the trick. I restructured your question layout a bit, assuming that only one of the Dxx checkboxes may be selected.
The idea is to pre-define the answers but only place them later on. The
time of placement does not matter and this means that the global state
used for numbering, etc. is always consistent.
See attached document for the proof that it works (i.e. the output of
"sdaps annotate"). It doesn't show the assigned variable names though.
Benjamin
\ExplSyntaxOn
\let\qbegin\sdaps_qobject_begin:nnn
\let\qend\sdaps_qobject_end:n
\newcommand{\idprefix}[2]{
#1
\sdaps_answer:n { idprefix} \sdaps_checkbox:nn {} {#2}
}
\newcommand{\iddigits}[1]{
\sdaps_qobject_begin:nnn {iddigits}{Option}{iddigits~#1}
\sdaps_checkbox_set_type:n {singlechoice}
\int_step_inline:nnnn { 0 } { 1 } { 9 } {\sdaps_answer:n { 1_##1}
\sdaps_checkbox:nn{2_##1}{} & }
\sdaps_qobject_end:n {iddigits}
}
\newcommand{\idheader}{
& \int_step_inline:nnnn { 0 } { 1 } { 9 } { ##1 & }
& \int_step_inline:nnnn { 0 } { 1 } { 9 } { ##1 & }
& \int_step_inline:nnnn { 0 } { 1 } { 9 } { ##1 & } \\
}
\ExplSyntaxOff
%\question{Person-ID}
% Setup is as follows:
% - One Header/Section to group all of these questions,
% this mostly affects numbering but is also used later.
% - One Option question for the first column (idprefix). The checkboxes
% are pre-defined and stored into LaTeX boxes. The question is then
% ended before the boxes are placed into the document.
% - Change the variable to get an iddigits prefix for all remaining
% questions in this section/group/context.
% - Place the pre-defined boxes and define the other questions in-place.
% Note that the pre-defined boxes must only be used exactly once.
\qbegin{sid}{Head}{Subject ID}
\qbegin{idprefix}{Option}{idprefix}
\ExplSyntaxOn
\sdaps_qobject_append_var:n {idprefix}
\sdaps_checkbox_set_type:n {singlechoice}
\ExplSyntaxOff
\newbox\boxda \newbox\boxdb \newbox\boxdc \newbox\boxdd \newbox\boxde
\savebox\boxda{\mbox{\idprefix{D10 }{10}}}
\savebox\boxdb{\mbox{\idprefix{D20 }{20}}}
\savebox\boxdc{\mbox{\idprefix{D21 }{21}}}
\savebox\boxdd{\mbox{\idprefix{D22 }{22}}}
\savebox\boxde{\mbox{\idprefix{D40 }{40}}}
\qend{idprefix}
\ExplSyntaxOn
\sdaps_qobject_append_var:n {iddigits}
\ExplSyntaxOff
\setlength{\tabcolsep}{2pt}
\begin{tabular}{l |c|ccccccccc c cccccccccc c cccccccccc c}
\idheader
\unhbox\boxda &\iddigits{1} & \iddigits{2} & \iddigits{3}\\
\unhbox\boxdb \\
\unhbox\boxdc \\
\unhbox\boxdd \\
\unhbox\boxde
\end{tabular}
\qend{sid}
On Tue, 2020-05-26 at 17:41 +0200, Benjamin Berg wrote:
> On Tue, 2020-05-26 at 14:51 +0200, Santiago Timón wrote:
> > I'm trying to use a custom layout, placing checkboxes in a bunch of
> > columns to have an ID mechanism. But I'm having this result:
> >
> > What could be the cause? (column lines used to inspect the
> > alignment)
> >
> > As you know, I'm not very proficient with LaTex and you'll probably
> > find this code quite nasty...
>
> Well … it is LaTeX, it doesn't tend to be very nice.
>
> Anyway, the problem is with your table definition. You are making
> every
> column 1pt wide, which is not even wide enough to fit the heading.
> And
> that then makes things left aligned in effect.
>
> You should do something like:
>
> \setlength{\tabcolsep}{2pt}
> \begin{tabular}{l |c|ccccccccc c cccccccccc c cccccccccc c}
>
> And I don't think you need the "\int_compare:nT { ##1 < 9 } { ~ }"
> everywhere, not sure why you are inserting spaces there.
>
>
> There is a problem though. Your code generates questions that are
> nested, and it seems that the metadata ends up not being readable.
> i.e.
> the "idprefix" question wraps the other questions.
>
> I don't have a good idea right now how to work around that.
>
> Btw. if you can, I would really suggest sticking a barcode into a
> field
> instead.
>
> Benjamin
>
> > \ExplSyntaxOn
> > \newcommand{\idprefix}[2]{
> > \sdaps_qobject_begin:nnn { } { Option } {idprefix}
> > \sdaps_qobject_append_var:n {idprefix}
> > \sdaps_checkbox_set_type:n {singlechoice}
> > #1
> > \sdaps_answer:n { idprefix} \sdaps_checkbox:nn {} {#2}
> > \sdaps_qobject_end:n {}
> > }
> >
> > \newcommand{\iddigits}[1]{
> > \sdaps_qobject_begin:nnn {iddigits}{Option}{iddigits_#1}
> > \sdaps_qobject_append_var:n {iddigits_#1}
> > \sdaps_checkbox_set_type:n {singlechoice}
> >
> > \int_step_inline:nnnn { 0 } { 1 } { 9 } {\sdaps_answer:n {
> > 1_##1} \sdaps_checkbox:nn{2_##1}{} & \int_compare:nT { ##1 < 9 } {
> > ~
> > } }
> >
> > \sdaps_qobject_end:n {iddigits}
> > }
> >
> > \newcommand{\idheader}{
> > & \int_step_inline:nnnn { 0 } { 1 } { 9 } { ##1 &
> > \int_compare:nT { ##1 < 9 } { ~ }}
> > & \int_step_inline:nnnn { 0 } { 1 } { 9 } { ##1 &
> > \int_compare:nT { ##1 < 9 } { ~ }}
> > & \int_step_inline:nnnn { 0 } { 1 } { 9 } { ##1 &
> > \int_compare:nT { ##1 < 9 } { ~ }} \\
> > }
> > \ExplSyntaxOff
> >
> > \question{Person-ID}
> > \qbegin{sid}{Option}{Subject ID}
> > \begin{tabular}{l
> > > m{1pt}|m{1pt}m{1pt}m{1pt}m{1pt}m{1pt}m{1pt}m{1pt}m{1pt}m{1pt} c
> > m{1pt}m{1pt}m{1pt}m{1pt}m{1pt}m{1pt}m{1pt}m{1pt}m{1pt}m{1pt} c
> > m{1pt}m{1pt}m{1pt}m{1pt}m{1pt}m{1pt}m{1pt}m{1pt}m{1pt}m{1pt} c}
> > \idheader
> > \idprefix{D10 }{10} &\iddigits{1} & \iddigits{2} &
> > \iddigits{3}\\
> > \idprefix{D20 }{20} \\
> > \idprefix{D21 }{21} \\
> > \idprefix{D30 }{30} \\
> > \idprefix{D40 }{40}
> > \end{tabular}
> > \qend{sid}
> >
> > Is there anything I'm missing?
> > Thanks!
> > --
> > Santi
annotated_questionnaire.pdf
Description: Adobe PDF document
signature.asc
Description: This is a digitally signed message part
