WEBVTT 00:00.799 --> 00:02.560 Hi! My name is Asilata Bapat, 00:02.560 --> 00:04.960 and I'm talking about Babel for academics. 00:04.960 --> 00:06.879 So, I'm an academic at a university, 00:06.879 --> 00:09.040 and I use Emacs, Org mode, and Babel 00:09.040 --> 00:11.280 for a whole bunch of work related tasks. 00:11.280 --> 00:12.559 And there are many other tools 00:12.559 --> 00:14.240 that one could use to help with 00:14.240 --> 00:15.200 this workflow. 00:15.200 --> 00:16.597 I won't be going through all of these, 00:16.597 --> 00:18.160 and the ones that I've listed are just 00:18.160 --> 00:20.240 a few of the many that are available. 00:20.240 --> 00:22.000 Today, I'll really be talking about 00:22.000 --> 00:24.080 my teaching workflow. 00:24.080 --> 00:27.840 Let's just dive right in to a demo. 00:27.840 --> 00:29.243 So, the first file that I want to 00:29.243 --> 00:31.599 show you is the notes and admin file. 00:31.599 --> 00:33.040 From this file, I'll generate 00:33.040 --> 00:35.440 a nice-looking PDF document of notes, 00:35.440 --> 00:36.963 and I'll also keep track of some 00:36.963 --> 00:38.399 course admin. 00:38.399 --> 00:43.200 So, the file that I have here is this one, 00:43.200 --> 00:44.719 and all of the files that I'm going to 00:44.719 --> 00:46.320 show you today are taken from a course 00:46.320 --> 00:48.096 that I'm teaching at the moment 00:48.096 --> 00:49.680 this semester. 00:49.680 --> 00:53.147 What I want to do is export this 00:53.147 --> 00:55.520 entire document to LaTeX 00:55.520 --> 00:56.320 because this is where 00:56.320 --> 00:58.800 I'll be writing my course notes. 00:58.800 --> 01:00.480 But before I do that, 01:00.480 --> 01:03.199 I have some setup that I want to do, 01:03.199 --> 01:05.199 and you'll notice some of these headings 01:05.199 --> 01:06.509 are tagged as noexport, 01:06.509 --> 01:08.400 and they won't be exported. 01:08.400 --> 01:11.680 The startup setting I'll skip, 01:11.680 --> 01:13.499 and then the main thing here 01:13.499 --> 01:14.880 is the LaTeX setup. 01:14.880 --> 01:18.560 So, I'm using these #+ option lines, 01:18.560 --> 01:21.360 and I've told Org that 01:21.360 --> 01:23.280 I want to use an unusual LaTeX class, 01:23.280 --> 01:24.880 I'll have to tell Org about it later, 01:24.880 --> 01:26.240 I'll do that in a moment, 01:26.240 --> 01:27.001 and I have some 01:27.001 --> 01:29.600 LaTeX header lines, and so on. 01:29.600 --> 01:31.360 And then I have some export settings, 01:31.360 --> 01:32.941 the first export setting is 01:32.941 --> 01:35.119 to export into a different directory, 01:35.119 --> 01:36.799 not just at the same level 01:36.799 --> 01:38.560 because I want everything to go into 01:38.560 --> 01:39.716 the artifacts directory, 01:39.716 --> 01:41.360 and then I can ignore that artifacts 01:41.360 --> 01:44.399 directory using Git. 01:44.399 --> 01:45.600 This is the first 01:45.600 --> 01:47.280 source code block that we see, 01:47.280 --> 01:49.759 which is the Babel side of things, 01:49.759 --> 01:52.079 and I've called it export-setup. 01:52.079 --> 01:55.759 The way I write it is, #+begin_src, 01:55.759 --> 01:56.965 the language that I want to use, 01:56.965 --> 01:58.159 which is emacs-lisp, 01:58.159 --> 01:59.600 and maybe some options, 01:59.600 --> 02:01.119 and this is collapsed at the moment, 02:01.119 --> 02:03.600 if I expand it, you'll see 02:03.600 --> 02:05.155 inside here, this is really 02:05.155 --> 02:07.600 just Elisp, Emacs Lisp. 02:07.600 --> 02:09.592 So, the first thing I've done is, 02:09.592 --> 02:12.440 I've added this LaTeX class 02:12.440 --> 02:15.360 to the list of known LaTeX classes. 02:15.360 --> 02:17.433 And the second thing I've done is, 02:17.433 --> 02:19.599 I have locally set the value of 02:19.599 --> 02:21.112 org-latex-pdf-process, 02:21.112 --> 02:24.720 which is the compiler, to something…, 02:24.720 --> 02:27.200 this command is complicated I guess, 02:27.200 --> 02:29.440 but what the main thing it's doing 02:29.440 --> 02:32.160 is that it's moving the generated output…, 02:32.160 --> 02:34.160 sorry, the generated image files 02:34.160 --> 02:35.169 to the output directory, 02:35.169 --> 02:37.519 so that everything can remain 02:37.519 --> 02:39.680 inside of this artifacts directory, 02:39.680 --> 02:41.519 and maybe it's doing some other things. 02:41.519 --> 02:43.680 And then there are some other 02:43.680 --> 02:47.120 setup options that I'll skip. 02:47.120 --> 02:49.360 So, this is a source code block, 02:49.360 --> 02:50.640 inside of the source code block 02:50.640 --> 02:52.319 everything is basically Emacs Lisp. 02:52.319 --> 02:54.640 How do I evaluate this? 02:54.640 --> 02:56.319 I just press Control c Control c (C-c C-c), 02:56.319 --> 02:57.920 and it evaluates everything, 02:57.920 --> 03:00.319 but if I want to automate the evaluation, 03:00.319 --> 03:02.080 there's one other thing I can do. 03:02.080 --> 03:04.658 So, let me jump down to 03:04.658 --> 03:06.720 the local variables section. 03:06.720 --> 03:09.740 In this local variable section 03:09.740 --> 03:11.680 I have an eval block, 03:11.680 --> 03:14.681 so, I've added a certain hook to the 03:14.681 --> 03:16.879 org-export-before-processing-hook, 03:16.879 --> 03:18.319 and that just resolves 03:18.319 --> 03:19.519 this reference from this file. 03:19.519 --> 03:23.040 It looks for a code block titled 03:23.040 --> 03:24.859 export-setup, and it runs it 03:24.859 --> 03:26.000 right before exporting, 03:26.000 --> 03:29.200 and this is all local to this buffer. 03:29.200 --> 03:30.799 So, before I export, 03:30.799 --> 03:34.000 it'll then read the correct options. 03:34.000 --> 03:37.519 And after this setup, 03:37.519 --> 03:39.760 I have the course plan, 03:39.760 --> 03:41.599 which is just what goes into my agenda 03:41.599 --> 03:43.360 as to-dos, I'll skip that. 03:43.360 --> 03:45.519 And after that, I have the actual notes, 03:45.519 --> 03:48.640 and what they actually look like…, 03:48.640 --> 03:54.400 so, this is what they actually look like, 03:54.400 --> 03:57.040 nicely LaTeXed with diagrams and so on, 03:57.040 --> 03:57.920 everything generated 03:57.920 --> 04:00.720 from that single Org file. 04:00.720 --> 04:04.480 I'll say more about diagrams later. 04:04.480 --> 04:06.080 I also have to write assignments 04:06.080 --> 04:07.260 and assignment solutions, 04:07.260 --> 04:10.239 so let me jump to that. 04:10.239 --> 04:11.840 Again, this is a very similar file, 04:11.840 --> 04:14.080 but I want to now export 04:14.080 --> 04:15.760 different headings to different files. 04:15.760 --> 04:16.639 This is not going to be 04:16.639 --> 04:18.320 exported all at once. 04:18.320 --> 04:19.759 So, again I have some setup, 04:19.759 --> 04:22.400 some general setup that I'll skip, 04:22.400 --> 04:25.120 export setup just like before, 04:25.120 --> 04:29.280 code setup for Python, really, 04:29.280 --> 04:31.280 I have a various…, a bunch of different 04:31.280 --> 04:33.199 languages here, so Shell and Python, 04:33.199 --> 04:35.967 and some helper functions. 04:36.088 --> 04:38.160 So, let me jump to this one called 04:38.160 --> 04:39.756 togglesolutions, this is again 04:39.756 --> 04:41.919 an Emacs Lisp code block. 04:41.919 --> 04:43.600 What this does is, 04:43.600 --> 04:48.632 it tells LaTeX to either toggle the 04:48.632 --> 04:50.336 display of solutions on, or off 04:50.336 --> 04:53.096 based on what the tag is 04:53.096 --> 04:54.240 for that particular assignment. 04:54.240 --> 04:57.520 So, whether if the assignment 04:57.520 --> 04:58.800 is tagged as solved, 04:58.800 --> 05:00.240 then the solution should be displayed, 05:00.240 --> 05:03.280 otherwise they shouldn't be. 05:03.280 --> 05:05.447 And here most of the assignments 05:05.447 --> 05:07.120 are tagged as solved, 05:07.120 --> 05:08.880 so in this case if I export this, 05:08.880 --> 05:11.840 the solutions will be displayed. 05:11.840 --> 05:20.800 Let's look at that. 05:20.800 --> 05:23.919 So, I see the solutions blocks, 05:23.919 --> 05:27.036 and this is because it's calling 05:27.036 --> 05:29.919 the toggle solutions piece of code. 05:29.919 --> 05:32.240 And the properties, 05:32.240 --> 05:33.840 if I expand this properties drawer, 05:33.840 --> 05:39.280 you see this output file name 05:39.280 --> 05:41.440 has a homework one dash solved, 05:41.440 --> 05:43.360 so it has a solved suffix, 05:43.360 --> 05:45.912 and this is related to the fact that 05:45.912 --> 05:47.680 I have a solved tag up here. 05:47.680 --> 05:48.960 So, let's see what happens 05:48.960 --> 05:51.199 if I delete the solved tag, 05:51.199 --> 05:52.639 so nothing's happened yet, 05:52.639 --> 05:54.000 but if I save the file, 05:54.000 --> 05:55.919 then suddenly this homework one 05:55.919 --> 05:58.240 dash solved becomes homework one, 05:58.240 --> 06:00.080 and this is desired behavior, 06:00.080 --> 06:02.084 this is what I want because 06:02.084 --> 06:03.222 I want to keep the solved 06:03.222 --> 06:04.497 and unsolved files separate. 06:04.497 --> 06:07.120 So, once again, if I put in 06:07.120 --> 06:09.440 the solved tag, and if I save, 06:09.440 --> 06:11.440 I get back the different file name. 06:11.440 --> 06:12.720 And how did I achieve this? 06:12.720 --> 06:16.479 This is again back in the setup section, 06:16.479 --> 06:19.280 it's the process-export-filenames block. 06:19.280 --> 06:21.120 It's some big piece of Elisp 06:21.120 --> 06:22.349 that I won't go through, 06:22.349 --> 06:24.240 but basically it's mapping over 06:24.240 --> 06:26.720 Org entries, and it's either 06:26.720 --> 06:30.080 adding or removing this solved suffix 06:30.080 --> 06:34.560 based on what tag it sees. 06:34.560 --> 06:36.781 Okay, when does this 06:36.781 --> 06:37.919 code block get evaluated? 06:37.919 --> 06:39.840 Well, I want it to be evaluated 06:39.840 --> 06:41.039 right before I save 06:41.039 --> 06:43.199 because I change something, 06:43.199 --> 06:45.840 I save, and I want the properties 06:45.840 --> 06:49.199 to be get updated accordingly. 06:49.199 --> 06:51.364 If I go down to the 06:51.364 --> 06:52.639 local variables section again. 06:52.639 --> 06:55.840 Again, I have a local variables 06:55.840 --> 06:56.800 section here, 06:56.800 --> 06:58.479 and I'm evaluating this Elisp, 06:58.479 --> 07:01.199 which is setting the before-save-hook 07:01.199 --> 07:04.240 to resolve the process-export-filenames 07:04.240 --> 07:05.716 function, and so that's what 07:05.716 --> 07:09.199 gives me that functionality. 07:09.199 --> 07:12.720 And finally, 07:12.720 --> 07:16.240 I have some skeletons, which are…. 07:16.240 --> 07:19.360 Emacs has this skeleton language, 07:19.360 --> 07:22.240 which is a rudimentary templating language. 07:22.240 --> 07:24.220 So, I've defined some templates 07:24.220 --> 07:26.319 for my assignment and worksheet 07:26.319 --> 07:29.440 in this little Emacs Lisp block, 07:29.440 --> 07:31.120 which I think I usually just evaluate 07:31.120 --> 07:33.280 manually, and then if I just call it, 07:33.280 --> 07:35.199 I get a nice-looking skeleton 07:35.199 --> 07:37.360 that gives me this assignment. 07:37.360 --> 07:40.080 One thing I want to show you 07:40.080 --> 07:43.199 in these assignments, or I mean, 07:43.199 --> 07:44.720 in this file in particular, 07:44.720 --> 07:46.560 are these dot source code blocks. 07:46.560 --> 07:49.840 So, I've had to type in or draw in 07:49.840 --> 07:52.000 some graphs in this assignment, 07:52.000 --> 07:54.720 and I can do that right from Org. 07:54.720 --> 07:56.400 So, this is some piece of code 07:56.400 --> 07:59.199 that's creating a file, 07:59.199 --> 08:00.879 which has this name, 08:00.879 --> 08:05.840 and if I evaluate this block, 08:05.840 --> 08:10.720 I see a results drawer with this file. 08:10.720 --> 08:12.711 And this is a PNG file, 08:12.711 --> 08:13.759 which now gets embedded 08:13.759 --> 08:15.680 into my LaTeX document. 08:15.680 --> 08:16.639 So, this is nice, 08:16.639 --> 08:18.720 I can actually delete this from here, 08:18.720 --> 08:20.479 and when I export, 08:20.479 --> 08:23.919 the file will get attached automatically. 08:23.919 --> 08:26.639 And similarly, 08:26.639 --> 08:28.800 in some other assignments here, 08:28.800 --> 08:30.639 I have some Python source, 08:30.639 --> 08:33.284 so I've had to type in 08:33.284 --> 08:34.527 some complicated matrices, 08:34.527 --> 08:36.128 and some complicated matrix products, 08:36.128 --> 08:36.640 and so on, 08:36.640 --> 08:38.000 which I didn't want to do by hand, 08:38.000 --> 08:39.760 so that I didn't introduce errors, 08:39.760 --> 08:41.599 so I've written some Python code. 08:41.599 --> 08:44.240 If I Control c Control c (C-c C-c) 08:44.240 --> 08:45.920 on this block, you'll notice, 08:45.920 --> 08:47.120 it's in the session matrix, 08:47.120 --> 08:49.200 so it's using the previous, 08:49.200 --> 08:52.399 the same kind of session. 08:52.399 --> 08:55.440 And you'll see that the results, 08:55.440 --> 08:57.760 because of the way I chose to format them, 08:57.760 --> 08:59.920 look like a nice drawer with 08:59.920 --> 09:01.600 nicely formatted LaTeX. 09:01.600 --> 09:03.920 Once again these results 09:03.920 --> 09:05.519 I can cut from the file, 09:05.519 --> 09:07.600 and the file will get exported…, 09:07.600 --> 09:09.200 when the file gets exported, 09:09.200 --> 09:10.480 these source code blocks will get 09:10.480 --> 09:12.000 evaluated, and the answer 09:12.000 --> 09:19.200 will show up in the file. 09:19.200 --> 09:20.097 And finally, 09:20.097 --> 09:21.363 the last thing I want to show you 09:21.363 --> 09:23.531 very briefly is the web page 09:23.531 --> 09:26.720 for this course. 09:26.720 --> 09:28.399 The only thing I want to show you here 09:28.399 --> 09:30.399 is that I have a Python source code block, 09:30.399 --> 09:33.279 which pulls in my handwritten course notes, 09:33.279 --> 09:36.399 and makes them into a nice-looking list 09:36.399 --> 09:38.880 with a nice-looking order, 09:38.880 --> 09:41.680 and then just exports as HTML. 09:41.680 --> 09:44.600 So, this is what 09:44.600 --> 09:46.080 the web page looks like, 09:46.080 --> 09:48.880 and you can see it at this URL. 09:48.880 --> 09:49.892 If you go click on 09:49.892 --> 09:52.800 the 2021 link at this URL. 09:52.800 --> 09:54.880 So, that's all that I wanted to say. 09:54.880 --> 09:58.360 Thank you very much!