Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Executing python code within $...$? [enhancement: add cb.sub command] #27

Open
dataopt opened this issue May 4, 2020 · 8 comments
Open
Labels
enhancement New feature or request

Comments

@dataopt
Copy link

dataopt commented May 4, 2020

In knitr, one could have something like this

```{r include = FALSE}
var = 123
```

Note that $\sqrt{`r var`} =`r sqrt(var)`$.

The last line will get rendered to html as
Note that \(\sqrt{123} = 11.0905365\).

Does CodeBraid allow executing the python code within $...$ to accomplish the same thing? My initial experiment suggests that it doesn't. Any help is greatly appreciated.

@gpoore
Copy link
Owner

gpoore commented May 4, 2020

It looks like Pandoc won't parse Markdown inside LaTeX math. So I'd suggest something like this, using a format string:

```{.python .cb.run}
from math import *
var = 123
```

Note that `rf"$\sqrt{{{var}}} = {sqrt(var)}$"`{.python .cb.expr}.

And then compile with something like

codebraid pandoc -f markdown -t html --mathjax -s -o temp.html temp.md

If this sort of situation comes up a lot, I suppose I might consider creating a string template command similar to the pysub I created in PythonTeX. Maybe something like

`$\sqrt{!{var}} = !{sqrt(var)}$`{.python .cb.sub}

Basically, everything inside backticks could be treated as a template string, with substitution fields denoted by !{<code>}, and an option to use multiple braces as delimiters (similar to Markdown backticks) to escape any literal braces within <code>. This would eliminate string quoting, string backslash escapes for non-raw strings, and LaTeX brace escaping.

@dataopt
Copy link
Author

dataopt commented May 4, 2020

Thank you for the helpful suggestion.

Any chance that the string template could become a command-line option for CodeBraid?

@gpoore
Copy link
Owner

gpoore commented May 4, 2020

I was thinking about a string template as another command that could be applied to code blocks. What are you thinking about in terms of a command-line option? How might that work?

@dataopt
Copy link
Author

dataopt commented May 4, 2020

I was thinking of an option (say -s) that will make the following syntax

`$\sqrt{!{var}} = !{sqrt(var)}$`{.python .cb.sub}

become automatic for the entire file.

EDIT: I probably haven't articulated myself very well. I am new to CodeBraid and I was just hoping that inlining would be as simple as Knitr. I do hope to use CodeBraid whenever possible since it's so much more powerful.

@gpoore
Copy link
Owner

gpoore commented May 4, 2020

It sounds like you're interested in a more compact, less verbose syntax, especially for inline code. I'm interested in adding alternate syntax eventually. So far I've limited everything to Pandoc's built-in attribute syntax. That can be verbose and isn't ideal in some respects, but it does allow all of the Markdown processing to be delegated to Pandoc, which has a lot of advantages.

@dataopt
Copy link
Author

dataopt commented May 4, 2020

That would be a fair assessment of my interest. But I now do understand the philosophy behind CodeBraid.

Perhaps one could just write a preprocessor that turns a compact syntax into the full-blown syntax that CodeBraid accepts. I should take a stab at this, perhaps mimicking what Knitr does to ease my own transition.

@gpoore
Copy link
Owner

gpoore commented May 5, 2020

You might look into Pandoc filters.

For example, create inline_cb.lua:

Code = function(elem)
    if string.sub(elem.text, 1, 3) == "py " then
        elem.text = string.sub(elem.text, 4, string.len(elem.text)):match("^%s*(.*)")
        elem.classes:insert("python")
        elem.classes:insert("cb.expr")
    end
    return elem
end

Create a file temp.md:

`py 1+1`

Run pandoc -L inline_cb.lua -f markdown -t markdown -o intermediate.md temp.md to create intermediate.md:

`1+1`{.python .cb.expr}

Then send that through Codebraid. Codebraid can use filters, but I don't yet have a way to run filters before code execution, which is what would be needed in this case. Also, I'm using an intermediate file instead of piping since I just realized that there isn't yet support for reading from stdin. Both of those limitations should be easy to fix in future releases, so that you could just use a filter when running Codebraid directly.

@dataopt
Copy link
Author

dataopt commented May 5, 2020

Thank you. I think adding pysub and overcoming those limitations will be tremendously useful.

@gpoore gpoore added the enhancement New feature or request label May 5, 2020
@gpoore gpoore changed the title Executing python code within $...$? Executing python code within $...$? [enhancement: add cb.sub command] May 5, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

2 participants