4

I'm trying to create a variable table depending on the sentences I want to be in it. Sometimes I will need all of them, sometimes not. This is what I've got for now.

\documentclass[11pt,a4paper]{article}
\usepackage[dvipsnames]{xcolor} 
\usepackage{xstring}
\usepackage{tabularx}
\usepackage{colortbl}

\renewcommand{\arraystretch}{2.5}
\newenvironment{competences}{
    \tabularx{\linewidth}{|m{1cm}|>{\raggedright\arraybackslash}X|}
    \hline
}{
    \endtabularx
}

\newcommand{\communiquer}[1]{
    \multicolumn{2}{|l|}{\cellcolor{violet!25} \textbf{Communiquer}}\\\hline
    \IfSubStr{#1}{1}{ & Faire le lien entre le langage naturel et le langage algébrique. Distinguer des spécificités du langage mathématique par rapport à la langue française.\\\hline}{}
    \IfSubStr{#1}{2}{& Expliquer à l'oral ou à l'écrit (sa démarche, son raisonnement, un calcul, un protocole de construction géométrique, un algorithme), comprendre les explications d'un autre et argumenter dans l'échange.\\\hline}{}
    \IfSubStr{#1}{3}{& Vérifier la validité d'une information et distinguer ce qui est objectif et ce qui est subjectif ; lire, interpréter, commenter, produire des tableaux, des graphiques, des diagrammes. \\\hline}{}  
}

\begin{document}

\begin{competences}
    \communiquer{2}
\end{competences}

\end{document}

This works juste fine when I use the command \communiquer{1,2,3}, but when I use \communiquer{2}for example, there are two extra vertical rules at the bottom of my table. I can't figure out why !

3

You probably have other macros to define besides \communiquer, so it's better to define an interface for them.

Here the \maketablemacro defines the new macro given as first argument so it prints the stated title (second argument) and chooses among the numbered paragraphs. Actually, you can choose arbitrary strings for labeling the paragraphs instead of 1, 2 and so on.

Note that since you write in French, the texts are better set after \begin{document}, so you don't need to adjust punctuation.

I also got rid of tabularx that's not needed as the first column has known width. Don't load both xcolor and colortbl, but rather pass the table option to the former.

\documentclass[11pt,a4paper]{article}
\usepackage[T1]{fontenc}
\usepackage[french]{babel}

\usepackage[dvipsnames,table]{xcolor} 
\usepackage{array}
\usepackage{xparse}

\ExplSyntaxOn

\NewDocumentEnvironment{competences}{}
 {
  \noindent
  \begin{tabular}
   {
    |m{1cm}|
    >{\raggedright\arraybackslash}
    m{ \dim_eval:n { \textwidth-4\tabcolsep-3\arrayrulewidth-1cm } }
    |
   }
  \hline
 }
 {
  \end{tabular}
 }

\NewDocumentCommand{\maketablemacro}{mmm}
 {% #1 is the macro to define
  % #2 is the title
  % #3 is the contents, in the form {1}{text1}{2}{text2}...
  \yohann_table_make_macro:Nnn #1 { #2 } { #3 }
 }

\tl_new:N \l__yohann_table_body_tl

\cs_new_protected:Nn \yohann_table_make_macro:Nnn
 {
  \cs_new:Npn #1 ##1
   {
    \multicolumn{2}{|l|}{\cellcolor{violet!25}\textbf{#2}} \\ \hline
    \tl_clear:N \l__yohann_table_body_tl
    \clist_map_inline:nn { ##1 }
     {
      \tl_put_right:Nn \l__yohann_table_body_tl
       {
        & \str_case:nnT { ####1 } { #3 } \tabularnewline \hline
       }
     }
    \tl_use:N \l__yohann_table_body_tl
   }
 }
\ExplSyntaxOff

\begin{document}

\maketablemacro{\communiquer}{Communiquer}{
 {1}{Faire le lien entre le langage naturel et le langage algébrique.
     Distinguer des spécificités du langage mathématique par rapport
     à la langue française.}
 {2}{Expliquer à l'oral ou à l'écrit (sa démarche, son raisonnement,
     un calcul, un protocole de construction géométrique, un algorithme),
     comprendre les explications d'un autre et argumenter dans l'échange.}
 {3}{Vérifier la validité d'une information et distinguer ce qui est
     objectif et ce qui est subjectif ; lire, interpréter, commenter,
     produire des tableaux, des graphiques, des diagrammes.}
}


\begin{competences}
\communiquer{2}
\end{competences}

\bigskip

\begin{competences}
\communiquer{2,1,3}
\end{competences}

\end{document}

I'd avoid setting \arraystretch to 2.5.

enter image description here

The macro could as well be defined as

\maketablemacro{\communiquer}{Communiquer}{
 {Faire}{Faire le lien entre le langage naturel et le langage algébrique.
  Distinguer des spécificités du langage mathématique par rapport
  à la langue française.}
 {Expliquer}{Expliquer à l'oral ou à l'écrit (sa démarche, son raisonnement,
     un calcul, un protocole de construction géométrique, un algorithme),
     comprendre les explications d'un autre et argumenter dans l'échange.}
 {Vérifier}{Vérifier la validité d'une information et distinguer ce qui est
     objectif et ce qui est subjectif ; lire, interpréter, commenter,
     produire des tableaux, des graphiques, des diagrammes.}
}

and calling the macro like

\communiquer{Expliquer,Faire,Vérifier}

would lead to the same result.

  • You're right ; I have other macros to define besides communiquer. I don't know anything about Latex3 and I'm going to investigate on that front but your answer is exactly what I'm looking for ! Thanks. – Yohann29100 Jul 16 '18 at 12:18
3

Rather than using \IfSubStr I suggest using property lists from LaTeX3. In addition to fixing the problem with your code this gives a nicer syntax because it allows you to use more meaningful abbreviations such as Faire, Expl etc instead of less meaningful numbers 1, 2, ....

Secondly, unless you also want to use these outside of a table there is no need to have a separate \communiquer command and a competences environment: you can just combine them into a single command. With this in place the code below creates its tables using the commands:

   \Competences{Faire}
   \Competences{Expl}
   \Competences{Faire,Ver,Expl}

The code below defines two (user) commands:

  • \AddCompetence for adding or defining competences. This is used as \AddCompetence{key}{description}
  • \Competences for writing a competence table. This accepts a comma separated list of keys.

The output of the MWE is:

enter image description here

Here is the code:

\documentclass[11pt,a4paper]{article}
\usepackage[dvipsnames]{xcolor}
\usepackage{expl3}
\usepackage{tabularx}
\usepackage{colortbl}

\ExplSyntaxOn
\prop_new:N \g__sentences_prop
\tl_new:N \l_sentence_tl
% add competence: \AddCompetence{key}{description}
\newcommand\AddCompetence[2]{
    \prop_gput:Nnn \g__sentences_prop {#1} {#2}
}
% internal command that writes one line of a competence table
\cs_new_protected:Npn \l__use_sentence:n #1 {
    &
    \prop_get:NnN \g__sentences_prop {#1} \l_sentence_tl
    \tl_use:N \l_sentence_tl
    \\\hline
}
% list competences: \Competences{comma separated list of keys}
\newcommand\Competences[1]{
    \begin{tabularx}{\linewidth}{|m{1cm}|>{\raggedright\arraybackslash}X|}
      \hline
      \multicolumn{2}{|l|}{\cellcolor{violet!25} \textbf{Communiquer}}\\\hline
      % loop through the list of keys keys and apply \l__use_sentence:n
      \clist_set:Nn \l_tmpa_clist {#1}
      \clist_map_function:NN \l_tmpa_clist \l__use_sentence:n
    \end{tabularx}
}
\ExplSyntaxOff

\AddCompetence{Faire}{Faire le lien entre le langage naturel et le langage algébrique. Distinguer des spécificités du langage mathématique par rapport à la langue française.}
\AddCompetence{Expl}{Expliquer à l'oral ou à l'écrit (sa démarche, son raisonnement, un calcul, un protocole de construction géométrique, un algorithme), comprendre les explications d'un autre et argumenter dans l'échange.}
\AddCompetence{Ver}{Vérifier la validité d'une information et distinguer ce qui est objectif et ce qui est subjectif ; lire, interpréter, commenter, produire des tableaux, des graphiques, des diagrammes}

\begin{document}

  \Competences{Faire}

  \Competences{Expl}

  \Competences{Faire,Ver,Expl}

\end{document}
1

I'm not quite capable to explain what's going on in great detaill but I found this:

\begin{competences}
    \communiquer{1}
\end{competences}

Gives this output: Image of output
Just like:

\begin{competences}
    \multicolumn{2}{|l|}{\cellcolor{violet!25} \textbf{Communiquer}}\\\hline 
      & Faire le lien entre le langage naturel et le langage algébrique. Distinguer des spécificités du langage mathématique par rapport à la langue française.\\\hline
      {} % This starts a new line
\end{competences}

Apparently the \IfSubStrs (for 2 and 3) are not ignored and start a new line after \hline.
(Note that any \communiquer with a 3 in its argument will give a desired result.)

An easy fix is to shuffle the position of the \hlines like so:

\newcommand{\communiquer}[1]{
    \multicolumn{2}{|l|}{\cellcolor{violet!25} \textbf{Communiquer}}   
    \IfSubStr{#1}{1}
        {\\\hline& Faire le lien entre le langage naturel et le langage algébrique. Distinguer des spécificités du langage mathématique par rapport à la langue française.}
        {}    
    \IfSubStr{#1}{2}
        {\\\hline & Expliquer à l'oral ou à l'écrit (sa démarche, son raisonnement, un calcul, un protocole de construction géométrique, un algorithme), comprendre les explications d'un autre et argumenter dans l'échange.}
        {}    
    \IfSubStr{#1}{3}
        {\\\hline & Vérifier la validité d'une information et distinguer ce qui est objectif et ce qui est subjectif ; lire, interpréter, commenter, produire des tableaux, des graphiques, des diagrammes.}  
        {}
    \\\hline
}

So let every next true \IfSubStr set the \\\hline for the previous one and always finish with a \\\hline.

This fixes your problem.

  • That makes sense, since I forgot to move the first \\\hline (the one after the multicolumn). I edited my post to fix this. – gebruiker Jul 16 '18 at 13:04

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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