tikz foreach to iterate over a python list via pythontex












0














I am using pythontex to read in a large python list from disk into my .tex file; I wish to use the foreach command from the tikz package to do some typesetting for each of the items in the list.



MWE is as follows:



documentclass{article}

usepackage{pythontex}
usepackage{tikz}

begin{document}

begin{pycode}
some_letters = ['A', 'B', 'C']
end{pycode}

normal for-loop:\
foreach letter in {a, b, c} {letter=letter\}

for-loop with texttt{pythontex}:\
foreach letter in {py{some_letters}} {letter=letter\}

end{document}


and is typeset as follows:



    normal for-loop:
letter=a
letter=b
letter=c

for-loop with pythontex:
letter=['A', 'B', 'C']


The first for-loop displays correctly. The second for-loop is where I attempt to read the python list. py{} returns the python object and what I want are comma separated values like in the first for-loop. I have unsuccessfully tried the following instead of py{some_letters}:



py{*some_letters}  % attempt to explode the python list
py{','.join(some_letters)} % manually separate with commas
% and defining a generator function to yield one value at a time


Does anyone know how I can use the foreach command with a python iterable? The desired output is as follows:



    normal for-loop:
letter=a
letter=b
letter=c

for-loop with pythontex:
letter=A
letter=B
letter=C









share|improve this question






















  • Here's what you want to do (almost...) py{print("\foreach \letter in {"+','.join(some_letters)+"} {letter=\letter\\}")} Basically, rather than printing just that list, you want to print the entire line of LaTeX so that everything is processed at the correct time. The only issue with this is that printing the list results in something creating None...I'm not immediately sure what the problem is.
    – whatisit
    3 hours ago
















0














I am using pythontex to read in a large python list from disk into my .tex file; I wish to use the foreach command from the tikz package to do some typesetting for each of the items in the list.



MWE is as follows:



documentclass{article}

usepackage{pythontex}
usepackage{tikz}

begin{document}

begin{pycode}
some_letters = ['A', 'B', 'C']
end{pycode}

normal for-loop:\
foreach letter in {a, b, c} {letter=letter\}

for-loop with texttt{pythontex}:\
foreach letter in {py{some_letters}} {letter=letter\}

end{document}


and is typeset as follows:



    normal for-loop:
letter=a
letter=b
letter=c

for-loop with pythontex:
letter=['A', 'B', 'C']


The first for-loop displays correctly. The second for-loop is where I attempt to read the python list. py{} returns the python object and what I want are comma separated values like in the first for-loop. I have unsuccessfully tried the following instead of py{some_letters}:



py{*some_letters}  % attempt to explode the python list
py{','.join(some_letters)} % manually separate with commas
% and defining a generator function to yield one value at a time


Does anyone know how I can use the foreach command with a python iterable? The desired output is as follows:



    normal for-loop:
letter=a
letter=b
letter=c

for-loop with pythontex:
letter=A
letter=B
letter=C









share|improve this question






















  • Here's what you want to do (almost...) py{print("\foreach \letter in {"+','.join(some_letters)+"} {letter=\letter\\}")} Basically, rather than printing just that list, you want to print the entire line of LaTeX so that everything is processed at the correct time. The only issue with this is that printing the list results in something creating None...I'm not immediately sure what the problem is.
    – whatisit
    3 hours ago














0












0








0







I am using pythontex to read in a large python list from disk into my .tex file; I wish to use the foreach command from the tikz package to do some typesetting for each of the items in the list.



MWE is as follows:



documentclass{article}

usepackage{pythontex}
usepackage{tikz}

begin{document}

begin{pycode}
some_letters = ['A', 'B', 'C']
end{pycode}

normal for-loop:\
foreach letter in {a, b, c} {letter=letter\}

for-loop with texttt{pythontex}:\
foreach letter in {py{some_letters}} {letter=letter\}

end{document}


and is typeset as follows:



    normal for-loop:
letter=a
letter=b
letter=c

for-loop with pythontex:
letter=['A', 'B', 'C']


The first for-loop displays correctly. The second for-loop is where I attempt to read the python list. py{} returns the python object and what I want are comma separated values like in the first for-loop. I have unsuccessfully tried the following instead of py{some_letters}:



py{*some_letters}  % attempt to explode the python list
py{','.join(some_letters)} % manually separate with commas
% and defining a generator function to yield one value at a time


Does anyone know how I can use the foreach command with a python iterable? The desired output is as follows:



    normal for-loop:
letter=a
letter=b
letter=c

for-loop with pythontex:
letter=A
letter=B
letter=C









share|improve this question













I am using pythontex to read in a large python list from disk into my .tex file; I wish to use the foreach command from the tikz package to do some typesetting for each of the items in the list.



MWE is as follows:



documentclass{article}

usepackage{pythontex}
usepackage{tikz}

begin{document}

begin{pycode}
some_letters = ['A', 'B', 'C']
end{pycode}

normal for-loop:\
foreach letter in {a, b, c} {letter=letter\}

for-loop with texttt{pythontex}:\
foreach letter in {py{some_letters}} {letter=letter\}

end{document}


and is typeset as follows:



    normal for-loop:
letter=a
letter=b
letter=c

for-loop with pythontex:
letter=['A', 'B', 'C']


The first for-loop displays correctly. The second for-loop is where I attempt to read the python list. py{} returns the python object and what I want are comma separated values like in the first for-loop. I have unsuccessfully tried the following instead of py{some_letters}:



py{*some_letters}  % attempt to explode the python list
py{','.join(some_letters)} % manually separate with commas
% and defining a generator function to yield one value at a time


Does anyone know how I can use the foreach command with a python iterable? The desired output is as follows:



    normal for-loop:
letter=a
letter=b
letter=c

for-loop with pythontex:
letter=A
letter=B
letter=C






tikz-pgf foreach pythontex






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked 5 hours ago









jeschwarjeschwar

1312




1312












  • Here's what you want to do (almost...) py{print("\foreach \letter in {"+','.join(some_letters)+"} {letter=\letter\\}")} Basically, rather than printing just that list, you want to print the entire line of LaTeX so that everything is processed at the correct time. The only issue with this is that printing the list results in something creating None...I'm not immediately sure what the problem is.
    – whatisit
    3 hours ago


















  • Here's what you want to do (almost...) py{print("\foreach \letter in {"+','.join(some_letters)+"} {letter=\letter\\}")} Basically, rather than printing just that list, you want to print the entire line of LaTeX so that everything is processed at the correct time. The only issue with this is that printing the list results in something creating None...I'm not immediately sure what the problem is.
    – whatisit
    3 hours ago
















Here's what you want to do (almost...) py{print("\foreach \letter in {"+','.join(some_letters)+"} {letter=\letter\\}")} Basically, rather than printing just that list, you want to print the entire line of LaTeX so that everything is processed at the correct time. The only issue with this is that printing the list results in something creating None...I'm not immediately sure what the problem is.
– whatisit
3 hours ago




Here's what you want to do (almost...) py{print("\foreach \letter in {"+','.join(some_letters)+"} {letter=\letter\\}")} Basically, rather than printing just that list, you want to print the entire line of LaTeX so that everything is processed at the correct time. The only issue with this is that printing the list results in something creating None...I'm not immediately sure what the problem is.
– whatisit
3 hours ago










1 Answer
1






active

oldest

votes


















0














You can print both things directly in Python, like so:



documentclass{article}

usepackage{pythontex}
usepackage{tikz}

begin{document}

begin{pycode}
import sys
some_letters = ['A', 'B', 'C']
end{pycode}

normal for-loop:\
foreach letter in {a, b, c} {letter=letter\}

for-loop with texttt{pythontex}:\
Version 1:\
py{print("\foreach \letter in {"+','.join(some_letters)+"} {letter=\letter\\}",end='%', flush=True)}
Version 2:\
begin{pycode}
print("\foreach \letter in {"+','.join(some_letters)+"} {letter=\letter\\}")
end{pycode}

end{document}


Fix for printing in pythontex and tikz loop



Caution! As I was struggling to figure out why the py{...} version wasn't working, I realized that you need to have a LaTeX comment (using %) at the end of the line. Apparently, some special character is getting printed out at the end of the line and interpreted as an extra iteration through the loop...ultimately producing None. Make sure to either have % at the end of your print(...) contents OR use the print() option end='%'.






share|improve this answer























    Your Answer








    StackExchange.ready(function() {
    var channelOptions = {
    tags: "".split(" "),
    id: "85"
    };
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function() {
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled) {
    StackExchange.using("snippets", function() {
    createEditor();
    });
    }
    else {
    createEditor();
    }
    });

    function createEditor() {
    StackExchange.prepareEditor({
    heartbeatType: 'answer',
    autoActivateHeartbeat: false,
    convertImagesToLinks: false,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: null,
    bindNavPrevention: true,
    postfix: "",
    imageUploader: {
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    },
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    });


    }
    });














    draft saved

    draft discarded


















    StackExchange.ready(
    function () {
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2ftex.stackexchange.com%2fquestions%2f469263%2ftikz-foreach-to-iterate-over-a-python-list-via-pythontex%23new-answer', 'question_page');
    }
    );

    Post as a guest















    Required, but never shown

























    1 Answer
    1






    active

    oldest

    votes








    1 Answer
    1






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    0














    You can print both things directly in Python, like so:



    documentclass{article}

    usepackage{pythontex}
    usepackage{tikz}

    begin{document}

    begin{pycode}
    import sys
    some_letters = ['A', 'B', 'C']
    end{pycode}

    normal for-loop:\
    foreach letter in {a, b, c} {letter=letter\}

    for-loop with texttt{pythontex}:\
    Version 1:\
    py{print("\foreach \letter in {"+','.join(some_letters)+"} {letter=\letter\\}",end='%', flush=True)}
    Version 2:\
    begin{pycode}
    print("\foreach \letter in {"+','.join(some_letters)+"} {letter=\letter\\}")
    end{pycode}

    end{document}


    Fix for printing in pythontex and tikz loop



    Caution! As I was struggling to figure out why the py{...} version wasn't working, I realized that you need to have a LaTeX comment (using %) at the end of the line. Apparently, some special character is getting printed out at the end of the line and interpreted as an extra iteration through the loop...ultimately producing None. Make sure to either have % at the end of your print(...) contents OR use the print() option end='%'.






    share|improve this answer




























      0














      You can print both things directly in Python, like so:



      documentclass{article}

      usepackage{pythontex}
      usepackage{tikz}

      begin{document}

      begin{pycode}
      import sys
      some_letters = ['A', 'B', 'C']
      end{pycode}

      normal for-loop:\
      foreach letter in {a, b, c} {letter=letter\}

      for-loop with texttt{pythontex}:\
      Version 1:\
      py{print("\foreach \letter in {"+','.join(some_letters)+"} {letter=\letter\\}",end='%', flush=True)}
      Version 2:\
      begin{pycode}
      print("\foreach \letter in {"+','.join(some_letters)+"} {letter=\letter\\}")
      end{pycode}

      end{document}


      Fix for printing in pythontex and tikz loop



      Caution! As I was struggling to figure out why the py{...} version wasn't working, I realized that you need to have a LaTeX comment (using %) at the end of the line. Apparently, some special character is getting printed out at the end of the line and interpreted as an extra iteration through the loop...ultimately producing None. Make sure to either have % at the end of your print(...) contents OR use the print() option end='%'.






      share|improve this answer


























        0












        0








        0






        You can print both things directly in Python, like so:



        documentclass{article}

        usepackage{pythontex}
        usepackage{tikz}

        begin{document}

        begin{pycode}
        import sys
        some_letters = ['A', 'B', 'C']
        end{pycode}

        normal for-loop:\
        foreach letter in {a, b, c} {letter=letter\}

        for-loop with texttt{pythontex}:\
        Version 1:\
        py{print("\foreach \letter in {"+','.join(some_letters)+"} {letter=\letter\\}",end='%', flush=True)}
        Version 2:\
        begin{pycode}
        print("\foreach \letter in {"+','.join(some_letters)+"} {letter=\letter\\}")
        end{pycode}

        end{document}


        Fix for printing in pythontex and tikz loop



        Caution! As I was struggling to figure out why the py{...} version wasn't working, I realized that you need to have a LaTeX comment (using %) at the end of the line. Apparently, some special character is getting printed out at the end of the line and interpreted as an extra iteration through the loop...ultimately producing None. Make sure to either have % at the end of your print(...) contents OR use the print() option end='%'.






        share|improve this answer














        You can print both things directly in Python, like so:



        documentclass{article}

        usepackage{pythontex}
        usepackage{tikz}

        begin{document}

        begin{pycode}
        import sys
        some_letters = ['A', 'B', 'C']
        end{pycode}

        normal for-loop:\
        foreach letter in {a, b, c} {letter=letter\}

        for-loop with texttt{pythontex}:\
        Version 1:\
        py{print("\foreach \letter in {"+','.join(some_letters)+"} {letter=\letter\\}",end='%', flush=True)}
        Version 2:\
        begin{pycode}
        print("\foreach \letter in {"+','.join(some_letters)+"} {letter=\letter\\}")
        end{pycode}

        end{document}


        Fix for printing in pythontex and tikz loop



        Caution! As I was struggling to figure out why the py{...} version wasn't working, I realized that you need to have a LaTeX comment (using %) at the end of the line. Apparently, some special character is getting printed out at the end of the line and interpreted as an extra iteration through the loop...ultimately producing None. Make sure to either have % at the end of your print(...) contents OR use the print() option end='%'.







        share|improve this answer














        share|improve this answer



        share|improve this answer








        edited 2 hours ago

























        answered 3 hours ago









        whatisitwhatisit

        1,037413




        1,037413






























            draft saved

            draft discarded




















































            Thanks for contributing an answer to TeX - LaTeX Stack Exchange!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid



            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.


            To learn more, see our tips on writing great answers.





            Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


            Please pay close attention to the following guidance:


            • Please be sure to answer the question. Provide details and share your research!

            But avoid



            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.


            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2ftex.stackexchange.com%2fquestions%2f469263%2ftikz-foreach-to-iterate-over-a-python-list-via-pythontex%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            Popular posts from this blog

            A CLEAN and SIMPLE way to add appendices to Table of Contents and bookmarks

            Calculate evaluation metrics using cross_val_predict sklearn

            Insert data from modal to MySQL (multiple modal on website)