594 private links
Video från Uppsala universitets youtube-kanal.
A pilot-scale demonstrator producing hydrogen gas (H2) using concentrated photovoltaics is currently making the rounds in the technical press. Exciting!
- https://www.chemistryworld.com/news/solar-hydrogen-production-scaled-up-in-real-world-test/4017291.article
- https://engineeringcommunity.nature.com/posts/harnessing-the-power-of-the-sun-to-produce-hydrogen-oxygen-and-heat
- https://hackaday.com/2023/04/27/making-hydrogen-with-solar-energy-with-oxygen-and-heat-a-bonus/
The paper from the Haussener lab was published April 10, 2023: Holmes-Gentle, I., Tembhurne, S., Suter, C. et al. Kilowatt-scale solar hydrogen production system using a concentrated integrated photoelectrochemical device. Nat Energy (2023).
Video by "Not Just Bikes", 2023-04-25.
A private collection of movie posters of Egyptian movies.
Learn the skills required to sysadmin a remote Linux server from the commandline.
Course restarts every first Monday of the month
The World Water Map can help us understand where and why water gaps arise, how climate change might aggravate them—and even how they might be managed.
Delightful and detailed interactive article explaining the physics of a bicycle.
Via Andy Baio.
A beginner's guide to creating your own little corner of the internet.
I don't know who is behind it, but I can get behind most of what it says.
Learn how to create unit tests for scientific papers in Python using PyTest.
H. | G. | Fajr | Shuruk | Dhohr | Asr | Magrib | Isha |
---|---|---|---|---|---|---|---|
1 | 23 | 03:17 | 05:37 | 12:01 | 15:11 | 18:16 | 20:16 |
2 | 24 | 03:13 | 05:34 | 12:01 | 15:12 | 18:18 | 20:19 |
3 | 25 | 03:09 | 05:31 | 12:01 | 15:14 | 18:21 | 20:23 |
4 | 26 | 04:05 | 06:28 | 13:00 | 16:15 | 19:23 | 21:26 |
5 | 27 | 04:01 | 06:25 | 13:00 | 16:17 | 19:25 | 21:29 |
6 | 28 | 03:57 | 06:22 | 13:00 | 16:18 | 19:28 | 21:32 |
7 | 29 | 03:53 | 06:19 | 12:59 | 16:19 | 19:30 | 21:35 |
8 | 30 | 03:48 | 06:16 | 12:59 | 16:21 | 19:33 | 21:39 |
9 | 31 | 03:44 | 06:13 | 12:59 | 16:22 | 19:35 | 21:42 |
10 | 1 | 03:41 | 06:10 | 12:59 | 16:24 | 19:37 | 21:43 |
11 | 2 | 03:41 | 06:07 | 12:58 | 16:25 | 19:40 | 21:44 |
12 | 3 | 03:40 | 06:04 | 12:58 | 16:26 | 19:42 | 21:45 |
13 | 4 | 03:39 | 06:01 | 12:58 | 16:28 | 19:45 | 21:46 |
14 | 5 | 03:38 | 05:58 | 12:57 | 16:29 | 19:47 | 21:47 |
15 | 6 | 03:37 | 05:55 | 12:57 | 16:30 | 19:50 | 21:47 |
16 | 7 | 03:36 | 05:52 | 12:57 | 16:32 | 19:52 | 21:48 |
17 | 8 | 03:35 | 05:49 | 12:57 | 16:33 | 19:54 | 21:49 |
18 | 9 | 03:34 | 05:46 | 12:56 | 16:34 | 19:57 | 21:50 |
19 | 10 | 03:33 | 05:43 | 12:56 | 16:36 | 19:59 | 21:51 |
20 | 11 | 03:32 | 05:40 | 12:56 | 16:37 | 20:02 | 21:52 |
21 | 12 | 03:31 | 05:37 | 12:55 | 16:38 | 20:04 | 21:53 |
22 | 13 | 03:31 | 05:34 | 12:55 | 16:39 | 20:07 | 21:54 |
23 | 14 | 03:30 | 05:31 | 12:55 | 16:41 | 20:09 | 21:55 |
24 | 15 | 03:29 | 05:28 | 12:55 | 16:42 | 20:11 | 21:56 |
25 | 16 | 03:28 | 05:25 | 12:54 | 16:43 | 20:14 | 21:57 |
26 | 17 | 03:27 | 05:22 | 12:54 | 16:44 | 20:16 | 21:57 |
27 | 18 | 03:26 | 05:19 | 12:54 | 16:46 | 20:19 | 21:58 |
28 | 19 | 03:25 | 05:16 | 12:54 | 16:47 | 20:21 | 21:59 |
29 | 20 | 03:24 | 05:13 | 12:54 | 16:48 | 20:24 | 22:00 |
H., day of Ramadan (ninth month in the Hijri calendar); G., day of March/April in the Gregorian calendar; Fajr prayer time and start of fast (astronomical twilight); Shuruk is sunrise (Sun at altitude 0°); Dhohr prayer time (noon); Asr prayer time; Magrib prayer time and break fast (sunset, 0°); Isha prayer time.
- https://www.islamiskaforbundet.se/pressmeddelande-fran-sveriges-imamrad-angaende-ramadan-2023/
- https://uppsalamoske.se/pdf/Bontider_2023_kallender.pdf
- https://www.islamiskaforbundet.se/bonetider/
- https://www.islamiskaforbundet.se/bonetiders-kalla/
- https://www.timeanddate.com/sun/sweden/uppsala
- https://www.timeanddate.com/astronomy/civil-twilight.html
- https://www.timeanddate.com/astronomy/refraction.html
H. | G. | Fajr | Shuruk | Dhohr | Asr | Magrib | Isha |
---|---|---|---|---|---|---|---|
1 | 23 | 03:18 | 05:35 | 12:00 | 15:10 | 18:14 | 20:12 |
2 | 24 | 03:15 | 05:33 | 11:59 | 15:11 | 18:16 | 20:15 |
3 | 25 | 03:11 | 05:30 | 11:59 | 15:13 | 18:19 | 20:18 |
4 | 26 | 04:07 | 06:27 | 12:59 | 16:14 | 19:21 | 21:21 |
5 | 27 | 04:03 | 06:24 | 12:58 | 16:16 | 19:23 | 21:24 |
6 | 28 | 03:59 | 06:21 | 12:58 | 16:17 | 19:26 | 21:27 |
7 | 29 | 03:55 | 06:18 | 12:58 | 16:18 | 19:28 | 21:31 |
8 | 30 | 03:51 | 06:15 | 12:58 | 16:20 | 19:30 | 21:34 |
9 | 31 | 03:47 | 06:12 | 12:57 | 16:21 | 19:33 | 21:37 |
10 | 1 | 03:42 | 06:09 | 12:57 | 16:23 | 19:35 | 21:40 |
11 | 2 | 03:38 | 06:06 | 12:57 | 16:24 | 19:37 | 21:44 |
12 | 3 | 03:34 | 06:03 | 12:56 | 16:25 | 19:40 | 21:46 |
13 | 4 | 03:33 | 06:00 | 12:56 | 16:27 | 19:42 | 21:47 |
14 | 5 | 03:33 | 05:57 | 12:56 | 16:28 | 19:45 | 21:48 |
15 | 6 | 03:32 | 05:54 | 12:55 | 16:29 | 19:47 | 21:49 |
16 | 7 | 03:31 | 05:51 | 12:55 | 16:30 | 19:49 | 21:50 |
17 | 8 | 03:30 | 05:48 | 12:55 | 16:32 | 19:52 | 21:51 |
18 | 9 | 03:29 | 05:45 | 12:55 | 16:33 | 19:54 | 21:52 |
19 | 10 | 03:28 | 05:42 | 12:54 | 16:34 | 19:56 | 21:53 |
20 | 11 | 03:27 | 05:39 | 12:54 | 16:35 | 19:59 | 21:53 |
21 | 12 | 03:26 | 05:37 | 12:54 | 16:37 | 20:01 | 21:54 |
22 | 13 | 03:25 | 05:34 | 12:54 | 16:38 | 20:04 | 21:55 |
23 | 14 | 03:24 | 05:31 | 12:53 | 16:39 | 20:06 | 21:56 |
24 | 15 | 03:23 | 05:28 | 12:53 | 16:40 | 20:08 | 21:57 |
25 | 16 | 03:22 | 05:25 | 12:53 | 16:42 | 20:11 | 21:58 |
26 | 17 | 03:21 | 05:22 | 12:53 | 16:43 | 20:13 | 21:59 |
27 | 18 | 03:20 | 05:19 | 12:52 | 16:44 | 20:15 | 22:00 |
28 | 19 | 03:19 | 05:16 | 12:52 | 16:45 | 20:18 | 22:01 |
29 | 20 | 03:18 | 05:14 | 12:52 | 16:46 | 20:20 | 22:02 |
H., day of Ramadan (ninth month in the Hijri calendar); G., day of March/April in the Gregorian calendar, Fajr prayer time and start of fast (astronomical twilight), Shuruk is sunrise (Sun at altitude 0°) , Dhohr prayer time (noon), Asr prayer time, Magrib prayer time and break fast (sunset, 0°), Isha prayer time.
What an interesting idea. A Python script that given an existing system creates an Ansible playbook that will duplicate it.
Fin och informativ visualisering av Per Axbom.
Have you also been in the situation where you need to write up your latest Raman spectra of ZnO?
And just exasperated at the thought of typing up all those mode assignments using LaTeX math notation (because honestly, it looks good).
I created this macro, \nonresmode{E2h}[E2l][long][diff]
, to make it easier to write.
Now all I have to do is write, for example, \nonresmode{A1LO}
, and LaTeX does all the work and produces a nicely typeset label.
Here is some example LaTeX source:
Non-resonant Raman with green laser excitation (\qty{532}{\nm}).
All the observed Raman modes could be assigned to either a fundamental mode
(\nonresmode{E2l}[][long], \nonresmode{A1TO}, \nonresmode{E1TO}, \nonresmode{E2h}[][long],
\nonresmode{E1LO}, \nonresmode{A1LO}), an overtone (\nonresmode{2E2l}[][long], \nonresmode{2E1LO},
\nonresmode{2A1LO}), a sum mode (\nonresmode{E2h}[E2l][long], \nonresmode{E2h}[2E2l][long],
\nonresmode{2E2h}[E2l][long], $2(\nonresmode{E2h}[E2l][long])$) or
a difference mode (\nonresmode{E2h}[E2l][long][diff]).
and the resulting output:
And here is the macro definitions (to avoid repeating the main "correspondence table" between the short-codes and the typeset text,
I opted to define multiple functions. I also made use of the beautiful macro by egreg that defines a case-like environment:
% defines a case environment
% code taken from a TeX.SE answer by egreg
% https://tex.stackexchange.com/a/451094/10824
% fantastic piece of code, works beautifully, for an arbitrary number of cases
\ExplSyntaxOn
\NewExpandableDocumentCommand{\stringcase}{mO{}m}{%
\str_case_e:nnF { #1 } { #3 } { #2 }
}
\ExplSyntaxOff
% not meant to be exposed to user
\NewDocumentCommand{\NonResonantModesShort}{m}{%
\stringcase{#1}[\textbf{??}]{%
% note, \text{} inside math environment will obey font settings from
% surrounding environment (e.g., bold) but \mathrm{} will not which
% makes it better for this purpose
% {shortcode}{LaTeX typeset text}
{E2l}{\ensuremath{E_{2\mathrm{l}}}}%
{A1TO}{\ensuremath{A_{1(\mathrm{TO})}}}%
{E1TO}{\ensuremath{E_{1(\mathrm{TO})}}}%
{E2h}{\ensuremath{E_{2\mathrm{h}}}}%
{E1LO}{\ensuremath{E_{1(\mathrm{LO})}}}%
{A1LO}{\ensuremath{A_{1(\mathrm{LO})}}}%
{2E2l}{\ensuremath{2E_{2\mathrm{l}}}}%
{2E2h}{\ensuremath{2E_{2\mathrm{h}}}}%
{2E1LO}{\ensuremath{2E_{1(\mathrm{LO})}}}%
{2A1LO}{\ensuremath{2A_{1(\mathrm{LO})}}}%
}%
}
% not meant to be exposed to user
\NewDocumentCommand{\NonResonantModesLong}{m}{%
\stringcase{#1}[\textbf{??}]{%
{E2l}{\ensuremath{E_{2\mathrm{(low)}}}}%
{A1TO}{\ensuremath{A_{1(\mathrm{TO})}}}%
{E1TO}{\ensuremath{E_{1(\mathrm{TO})}}}%
{E2h}{\ensuremath{E_{2\mathrm{(high)}}}}%
{E1LO}{\ensuremath{E_{1(\mathrm{LO})}}}%
{A1LO}{\ensuremath{A_{1(\mathrm{LO})}}}%
{2E2l}{\ensuremath{2E_{2\mathrm{(low)}}}}%
{2E2h}{\ensuremath{2E_{2\mathrm{(high)}}}}%
{2E1LO}{\ensuremath{2E_{1(\mathrm{LO})}}}%
{2A1LO}{\ensuremath{2A_{1(\mathrm{LO})}}}%
}%
}
% not meant to be exposed to user
\NewDocumentCommand{\NonResonantModesLogic}{m O{short}}{%
\IfNoValueTF{#2}{%
% arg #2 (optional) not given, proceed as "short"
\NonResonantModesShort{#1}%
}{%
% arg #2 (optional) was given, check if it is "long"
\ifthenelse{\equal{#2}{long}}{%
% "long" was given
\NonResonantModesLong{#1}%
}{%
% arg was given, but is not equal to "long"
% check if it is "short"
\ifthenelse{\equal{#2}{short}}{%
\NonResonantModesShort{#1}%
}{%
% arg was neither "long" nor "short", something else
\NonResonantModesShort{}%
}%
}%
}%
}
% Non-resonant Raman modes of ZnO
% \nonresmode{E2h}[E2l][long][diff]
% Use \nonresmode like this:
% \nonresmode{E2l} => E2l
% \nonresmode{E2l}[][long] => E2low
% \nonresmode{} => ??
% \nonresmode => ERROR
% \nonresmode{E2l}[E2h] => E2l+E2h
% \nonresmode{E2l}[E2h][][diff] => E2l-E2h
% \nonresmode{E2l}[E2h][long] => E2low + E2high
% only specify optional arguments if necessary, i.e.,
% please don't do \nonresmode{E2l}[][][], but please do \nonresmode{E2l}
% remember, optional arg "o" will supply the special -NoValue- marker if not given
% the arg O{sum} is an optional arg with the default value "sum"
\NewDocumentCommand{\nonresmode}{m o O{short} O{sum}}{%
\IfNoValueTF{#2}{%
% no arg #2 was given, which means we are typesetting a single mode
% if no arg #2 was given, then we can disregard #4
\IfNoValueTF{#3}{%
% this way, if #3 was not given, we avoid passing the special -NoValue- marker
\NonResonantModesLogic{#1}%
}{%
% if #3 was given, pass it on, unless it was empty
\ifthenelse{\isempty{#3}}{%
\NonResonantModesLogic{#1}%
}{%
\NonResonantModesLogic{#1}[#3]%
}%
}%
}{%
% If optional arg #2 was given and is empty, perform the same code as if -NoValue-
\ifthenelse{\isempty{#2}}{%
\IfNoValueTF{#3}{%
% this way, if #3 was not given, we avoid passing the special -NoValue- marker
\NonResonantModesLogic{#1}%
}{%
% if #3 was given, pass it on, unless it was empty
\ifthenelse{\isempty{#3}}{%
\NonResonantModesLogic{#1}%
}{%
\NonResonantModesLogic{#1}[#3]%
}%
}%
}{%
% if #2 is not -NoValue- nor empty, then just assume that it is one of the mode shortcodes
% (we don't try to check that it is in fact part of that set)
% But first, determine if we are writing "sum" or "diff" modes
% (note that we assume that #4 has a value, since it is the last arg we never expect it%
% to be given explicitly empty)
\ifthenelse{\equal{#4}{diff}}{%
% Since #4 has a default, we can simplify this if-else to only check for "diff"
% and we can then assume that the else-clause matches "sum"
% But note that arg #3 may have been given explicity empty, [], thus overriding the default
% so we must check for that
\ifthenelse{\isempty{#3}}{%
% Note, to get consistent spacing around the +/- sign whether the
% call to \nonresmode{} is surrounded by math mode or not, it is
% good to surround everything in ensuremath{} here
% Also, for "short" mode, I want to kill the space surrounding the +/- sign
% (to keep it compact, which is probably what the user wants in "short" mode)
\ensuremath{\NonResonantModesLogic{#1}{-}\NonResonantModesLogic{#2}}%
}{%
\ifthenelse{\equal{#3}{long}}{%
\ensuremath{\NonResonantModesLogic{#1}[#3]-\NonResonantModesLogic{#2}[#3]}%
}{%
\ensuremath{\NonResonantModesLogic{#1}{-}\NonResonantModesLogic{#2}}%
}%
}%
}{%
\ifthenelse{\isempty{#3}}{%
\ensuremath{\NonResonantModesLogic{#1}{+}\NonResonantModesLogic{#2}}%
}{%
\ifthenelse{\equal{#3}{long}}{%
\ensuremath{\NonResonantModesLogic{#1}[#3]+\NonResonantModesLogic{#2}[#3]}%
}{%
\ensuremath{\NonResonantModesLogic{#1}{+}\NonResonantModesLogic{#2}}%
}%
}%
}%
}%
}%
}
It's all the rage these days. Let's collect the ones we've heard about so far.
Text
- GPT-4, the latest large-language model (LLM) by OpenAI.
- GPT3 (known as ChatGPT), the previous generation LLM by OpenAI.
- Falcon 40B, FOSS LLM. Video review by Sentdex.
- https://chat.lmsys.org
- https://github.com/declare-lab/flan-alpaca
- https://scifilogic.com/foss-llm-that-you-can-run-your-pc/
- https://www.technologyreview.com/2022/07/12/1055817/inside-a-radical-new-project-to-democratize-ai/
- https://www.databricks.com/blog/2023/04/12/dolly-first-open-commercially-viable-instruction-tuned-llm
- Elicit AI-powered science paper search tool (not FOSS, behind sign-up wall)
Image
- Scribble Diffusion, turn a scribble (and an associated text prompt) into a refined image. Powered by ControlNet. Simple to use, generated images 512px square and easy to download. Seems to work well in Chromium, less so in Firefox.
- Midjourney, generative AI service that creates images from language prompts. How to use Midjourney, Tom's Guide.
- https://drawfast.tldraw.com, via @simon@simonwillison.net
I'm well aware there are like a 100 more, will add to this list as I get time.
On a related note, it's too bad Shaarli does not allow others to edit or at least comment on posts (but see this post regarding developments).
But if you really want, I guess you could open the post on its own page (see permalink below) and annotate that page using Hypothes.is.
Links and notes
- https://www.wired.com/story/how-chatgpt-works-large-language-model
- https://changelog.com/podcast/578 What exactly is Open Source AI?
This unofficial site let's you explore the In Our Time archive by topic and year.
Via kottke.org.
Could we cross-reference objects (tables, figures, etc.) that exist in the attached papers (whose code-base is foreign to the thesis) while also having these cross-references target the appropriate paper in the List of Papers, with the aid of the cleveref, caption and hyperref packages?
To clarify, for a compilation PhD thesis, where the thesis itself is created using LaTeX, but where the attached papers (hence the compilation part in the thesis) may or may not have been created using LaTeX (even if they were created using LaTeX, their codebase is not available to the thesis at runtime).
So we need to setup some sort of static list of manually created \label{}
s, that should occupy a counter and namespace separate from the thesis' own figures, tables, etc.
Preamble, literally
Uppsala university has a thesis template (my version, LuaLaTeX-based) that defines a listofpapers
environment (the details of which are not important right now) that allows us to create a List of Papers and easily assign a label for each paper, like this:
\begin{listofpapers}
\item\label{P1}
Li, C.; Ahmed, T.; Ma, M.; Edvinsson, T.; Zhu, J. %
Photocatalytic properties of ZnO/CdS nanoarrays\\%
\item \label{P2}
Ahmed, T.; Edvinsson, T. %
Photocatalytic activity of ultrasmall ZnO\\%
\end{listofpapers}
The above works in conjunction with the following definitions in the preamble:
\usepackage{cleveref}
\crefname{listofpapersc}{\textbf{\textsc{paper}}}{\textbf{\textsc{papers}}}
\Crefname{listofpapersc}{\textbf{\textsc{paper}}}{\textbf{\textsc{papers}}}
\creflabelformat{listofpapersc}{#2\textbf{\textsc{#1}}#3}
to give a nicely formatted Paper 1 (in small-caps in this case) in the text when we issue \cref{P1}
.
Solution: new floating environment and a custom cleveref format per paper
I have limited time to type this up, so here goes.
\usepackage{newfloat} % for the DeclareFloatingEnvironment cmd
\usepackage[nameinlink]{cleveref}
\crefname{listofpapersc}{\textbf{\textsc{paper}}}{\textbf{\textsc{papers}}}
\Crefname{listofpapersc}{\textbf{\textsc{paper}}}{\textbf{\textsc{papers}}}
\creflabelformat{listofpapersc}{#2\textbf{\textsc{#1}}#3}
\DeclareFloatingEnvironment[within=none]{tableP1}
\crefformat{tableP1}{\textsc{#2tab.~#1#3}~of\space\cref{P1}}
\Crefformat{tableP1}{\textsc{#2Tab.~#1#3}~of\space\cref{P1}}
\crefrangeformat{tableP1}{\textsc{tabs.~#3#1#4--#5#2#6}~of\space\cref{P1}}
\Crefrangeformat{tableP1}{\textsc{Tabs.~#3#1#4--#5#2#6}~of\space\cref{P1}}
\crefmultiformat{tableP1}{%
\scshape tabs.~#2#1#3}{%
\:\&\:#2#1#3~\textnormal{of\space}\cref{P1}}{%
, #2#1#3}{%
\:\&\:#2#1#3~\textnormal{of\space}\cref{P1}}
\Crefmultiformat{tableP1}{%
\scshape Tabs.~#2#1#3}{%
\:\&\:#2#1#3~\textnormal{of\space}\cref{P1}}{%
, #2#1#3}{%
\:\&\:#2#1#3~\textnormal{of\space}\cref{P1}}
\crefrangemultiformat{tableP1}{%
\scshape tabs.~#3#1#4--#5#2#6}{%
\:\&\:#3#1#4--#5#2#6~\textnormal{of\space}\cref{P1}}{%
, #3#1#4--#5#2#6}{%
\:\&\:#3#1#4--#5#2#6~\textnormal{of\space}\cref{P1}}
\Crefrangemultiformat{tableP1}{%
\scshape Tabs.~#3#1#4--#5#2#6}{%
\:\&\:#3#1#4--#5#2#6~\textnormal{of\space}\cref{P1}}{%
, #3#1#4--#5#2#6}{%
\:\&\:#3#1#4--#5#2#6~\textnormal{of\space}\cref{P1}}
and repeat the last block (everything down from DeclareFloatingEnvironment
) for figureP1
, and for tableP2
, figureP2
, etc.
And then, for the pièce de résistance, in one fell swoop we abuse both the listofpapers
environment and the phantomcaption
command to create the label
s that our cross-references will target:
\begin{listofpapers}
\item\label{P1}
Li, C.; Ahmed, T.; Ma, M.; Edvinsson, T.; Zhu, J. %
Photocatalytic properties of ZnO/CdS nanoarrays\\%
\bgroup
\captionsetup{type=figureP2}
\phantomcaption\label{fig:P1-schematic}
\phantomcaption\label{fig:P1-mechanism}
[... more figure labels as necessary ...]
\egroup
\bgroup
\captionsetup{type=tableP2}
\phantomcaption\label{tab:P1-parameters}
\phantomcaption\label{tab:P1-rates}
[... more table labels as necessary ...]
\egroup
\item \label{P2}
Ahmed, T.; Edvinsson, T. %
Photocatalytic activity of ultrasmall ZnO\\%
\end{listofpapers}
captionsetup
needs to be constrained by an environment (the manual suggests a minipage, which works fine but occupies a little bit of vertical space on the page), and it turns out group
works in this context and has the added benefit of occupying no space in the List of Papers.
With that, we can simply type \cref{fig:P1-schematic}
in the source to produce a nicely formatted cross-reference in the output document. The use of small-caps, abbreviated label names, and the trailing of paper X is my way to make these references contrast with the normal, in-thesis cross-references.
Here's an example of how the typeset cross-references look like:
Links and notes
- https://tex.stackexchange.com/questions/383587/plural-cref-with-custom-unnumbered-subsections
- https://tex.stackexchange.com/questions/597048/cleveref-fig-for-citing-multiple-subfigures-from-the-same-figure-but-figs
- https://gist.github.com/ummels/3428745
- https://reddit.com/r/LaTeX/comments/5gv6al/reference_multiple_list_items_in_single/
- the cleveref manual
- the caption and subcaption manuals
A small wrinkle when using bib2df
together with bib2gls
: the latter does not tolerate empty cross-reference fields.
bib2df::df2bib()
takes a tibble and generates the entries.bib
file, and since the tibble by necessity contains one column for each field, any entries with empty see
fields get converted by bib2df::df2bib()
to see={}
. The presence of any glossary entry with an empty see={}
field causes bib2gls
to fail:
Processing resource thesis-1.glstex.
Parsing fields for entry 'absorption_coefficient'
Checking field aliases for absorption_coefficient.
Value=>user1={}
>> name={{}\ensuremath{\alpha}}
=>> name={{}\ensuremath{\alpha}}
>> first={absorption coefficient, \ensuremath{\alpha}}
=>> first={absorption coefficient, \ensuremath{\alpha}}
>> text={absorption coefficient}
=>> text={absorption coefficient}
>> description={absorption coefficient}
=>> description={absorption coefficient}
>> user1={}
=>> user1={}
>> see={}
=>> see={}
Checking cross-references for: absorption_coefficient
Field alias not set.
Error: EOFException
com.dickimawbooks.texparserlib.TeXParser.popStack(TeXParser.java:2635)
com.dickimawbooks.texparserlib.TeXObjectList.popArg(TeXObjectList.java:1294)
com.dickimawbooks.texparserlib.TeXObjectList.popArg(TeXObjectList.java:1275)
com.dickimawbooks.bib2gls.Bib2GlsEntry.initSeeRef(Bib2GlsEntry.java:4710)
com.dickimawbooks.bib2gls.Bib2GlsEntry.initCrossRefs(Bib2GlsEntry.java:4694)
com.dickimawbooks.bib2gls.GlsResource.processBibList(GlsResource.java:6722)
com.dickimawbooks.bib2gls.Bib2Gls.process(Bib2Gls.java:2706)
com.dickimawbooks.bib2gls.Bib2Gls.main(Bib2Gls.java:6616)
As you can see, other fields may be empty, but not the see
field.
This is not a bug in either bib2df::
or bib2gls
, and I don't expect either project to "fix" this issue. The former is not meant for and has no notion of glossaries, and the latter is not really expecting us to be generating the .bib
file, so why should there be empty see
fields?
To work around this I suggest removing all lines with see={}
fields from the entries.bib
file, here an example using sed:
sed -i '"/[Ss]ee\s*=\s*{}/d" entries.bib
I simply added this sed
command to the R chunk that calls bib2df::df2bib()
.
I should probably add that my reason for generating the glossary bib-file from R in the first place was to make use of the excellent constants
library.
Notes and links
This behaviour was observed on Ubuntu 22.04, R 4.1.3, TeXLive 2022, glossaries-extra 1.50, bib2gls 3.2, bib2df 1.1.1.
A work in progress. Over 700 pages, encompassing band structure, symmetry and much more.
By Daniel Arovas, UC Santa Barbara.
Lectures on theoretical physics from Cambridge University professor David Tong.
David Tong at Cambridge is a gifted educator and communicator who has written lecture notes that span a wide swath of the physics curriculum, from introductory material on mechanics through advanced graduate-level treatments of quantum field theory. Truly, these are a fantastic resource, made freely available.
Link and quote thanks to Douglas Natelson (nanoscale views).
I particularly like his notes on solid state physics (which contains links to other resources).