Dans un code, je cherche à savoir si l'argument contient le caractère tube | en première position. Si oui, je veux le supprimer \StrGobbleLeft{#1}{1} ; mon problème est que je ne peux pas stocker le résultat de \StrGobbleLeft{#1}{1} dans une macro, je veux récupérer #1 (sans le tube) pour le remettre plus bas dans la macro. Est-il possible de faire ceci avec xstring ?

Ouvrir dans l'éditeur Overleaf
\documentclass{article}
\usepackage{xstring}

\newenvironment{mytabular}[1]{%
    \IfBeginWith{#1}{|}
            {\StrGobbleLeft{#1}{1} %si vrai
                \begin{tabular}{#1}}
            {\begin{tabular}{||#1||}}} %si faux
        {\end{tabular}}
\begin{document}
        \begin{mytabular}{c|c}
            \hline
        1   &  2 \\ 
            \hline
        3   & 4 \\ 
        \end{mytabular}

        \bigskip

        \begin{mytabular}{|cc}
            \hline
        4   &  5\\ 
            \hline
        6   &   7 \\ 
        \end{mytabular} 
    \end{document}
\end{document}

Posée 15 Aoû '17, 19:16

Nikopol's gravatar image

Nikopol
1.0k614
Taux d'acceptation : 42%

Modifiée 29 Aoû '17, 18:15

Pathe's gravatar image

Pathe ♦♦
7.5k42203251


Je propose une solution utilisant LuaLaTeX :

Ouvrir dans l'éditeur Overleaf
\documentclass{article}
\usepackage{luacode}

\begin{luacode}
function if_begin_tube(String)
    local x = string.sub(String,1,1) -- on stocke le premier caractère dans une variable
    if x=="|" then -- si ce premier caractère est un tube...
        String = string.gsub(String,"|","",1) -- on le supprime de la chaîne
        tex.sprint("\\begin{tabular}{"..String.."}") -- on ouvre le tableau avec la chaîne modifiée
    else -- sinon...
        tex.sprint("\\begin{tabular}{||"..String.."||}") -- on ouvre le tableau avec la chaîne non modifiée encadrée par un double tube
    end
end
\end{luacode}

\newcommand\BeginMyTabular[1]{\directlua{if_begin_tube(\luastring{#1})}}

\newenvironment{mytabular}[1]{\BeginMyTabular{#1}}{\end{tabular}}

\begin{document}
        \begin{mytabular}{c|c}
            \hline
        1   &  2 \\ 
            \hline
        3   & 4 \\ 
        \end{mytabular}

        \bigskip

        \begin{mytabular}{|cc}
            \hline
        4   &  5\\ 
            \hline
        6   &   7 \\ 
        \end{mytabular} 
\end{document}
Lien permanent

Publiée 29 Aoû '17, 02:22

Namrod's gravatar image

Namrod
2831714
Taux d'acceptation : 20%

Modifiée 29 Aoû '17, 18:16

Pathe's gravatar image

Pathe ♦♦
7.5k42203251

Je pensais que xstring pouvait le faire, vu la quantité de choses que peut faire cette extension.

Ayant compris (@touhami l'a confirmé) que cela n’était pas possible avec xstring, je suis passé par \@ifnextchar

Ouvrir dans l'éditeur Overleaf
\documentclass{article}
\makeatletter
\def\sitube#1{\@sitube#1\@nil}
\def\@sitube{%
  \@ifnextchar|{\tube}{\notube}}
\def\tube#1#2\@nil{\textbf{#2}}
\def\notube#1\@nil{\emph{#1}}
\makeatother
\begin{document}
\sitube{|toto}

\sitube{toto}
\end{document}

J'ai pu ainsi résoudre mon problème.

Lien permanent

Publiée 29 Aoû '17, 00:13

Nikopol's gravatar image

Nikopol
1.0k614
Taux d'acceptation : 42%

Modifiée 29 Aoû '17, 18:16

Pathe's gravatar image

Pathe ♦♦
7.5k42203251

Votre réponse
(dés)activer l'aperçu

Suivre cette question

Par courriel :

Une fois que vous serez enregistré, vous pourrez souscrire à n'importe quelle mise à jour ici

Par flux RSS :

Réponses

Réponses et commentaires

Bases de Markdown

  • *italique* ou _italique_
  • **gras** ou __gras__
  • Lien ::[texte](http://url.com/ "Titre ")
  • Image : ?![alt texte](/path/img.jpg "Titre ")
  • Liste numérotée : 1. Foo 2. Bar
  • Pour ajouter un passage à la ligne, ajoutez deux espaces à l'endroit où vous souhaitez que la ligne commence.
  • Les balises HTML de base sont également prises en charge.