This commit is contained in:
2026-08-29 22:46:43 +12:00
commit f74c44b751
9 changed files with 978 additions and 0 deletions

28
abstract.md Normal file
View File

@@ -0,0 +1,28 @@
---
title: Interfacing piezoelectric inter-digitated transducers to printed circuit boards
institute:
- uc: University of Canterbury
author:
- Logan Henderson:
institute: uc
- Dr Joe Chen:
institute: uc
- Dr Ciaran Moore:
institute: uc
- Dr Romain Arnal:
institute: uc
---
Ultrasonic interdigitated transducers (IDTs) can be used for a wide variety of sensing and transduction applications such as sonoporation @rich_sonoporation_2022, biosensing @fertier_love_2009, microfluidic mixing @shilton_nanoliter-droplet_2014 and particle manipulation @ding_-chip_2012. Packaging these actuators in lab-on-a-chip devices expands the number of applications that they can address; however, this packaging introduces the challenge of securing the fragile piezoelectric substrate, which is typically only 0.5 mm thick, to a print circuit board (PCB) that typically houses connectors and circuitry for impedance matching and amplification.
We explore different methods of interfacing piezoelectric substrate to a fiberglass PCBs, and the resulting effects on the performance at multiple frequencies, from 10 MHz to 250 MHz by measuring the Rayleigh wave transmission. Both IDTs were attached to a vector network analyser with the response of the system measured with additional matching circuits added where needed.
![system response of 10MHz IDTs](image.png)
![system response of 100MHz IDTs](image-1.png)
Initial results show that attaching IDT to PCBs with a two part araldite epoxy causes significant attenuation in lower frequency IDTs operating around 10MHz and less attenuation iyn higher frequenc IDTs that operate closer to 100MHz. Matching circuits were shown to have a minor effect on the output at the operating frequency, while also increasing attenuation above and below the operating frequency. This work paves the wave for the creation for higher performance and more robust ultrasonic based lab on chip devices.
\pagebreak
# References {.reset-citation-positions}

176
author-info-blocks.lua Normal file
View File

@@ -0,0 +1,176 @@
--[[
affiliation-blocks – generate title components
Copyright © 2017–2021 Albert Krewinkel
Permission to use, copy, modify, and/or distribute this software for any purpose
with or without fee is hereby granted, provided that the above copyright notice
and this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
THIS SOFTWARE.
]]
local List = require 'pandoc.List'
local utils = require 'pandoc.utils'
local stringify = utils.stringify
local default_marks
local default_marks = {
corresponding_author = FORMAT == 'latex'
and {pandoc.RawInline('latex', '*')}
or {pandoc.Str '✉'},
equal_contributor = FORMAT == 'latex'
and {pandoc.RawInline('latex', '$\\dagger{}$')}
or {pandoc.Str '*'},
}
local function intercalate(lists, elem)
local result = List:new{}
for i = 1, (#lists - 1) do
result:extend(lists[i])
result:extend(elem)
end
if #lists > 0 then
result:extend(lists[#lists])
end
return result
end
--- Check whether the given author is a corresponding author
local function is_corresponding_author(author)
return author.correspondence and author.email
end
--- Create inlines for a single author (includes all author notes)
local function author_inline_generator (get_mark)
return function (author)
local author_marks = List:new{}
if author.equal_contributor then
author_marks[#author_marks + 1] = get_mark 'equal_contributor'
end
local idx_str
for _, idx in ipairs(author.institute) do
if type(idx) ~= 'table' then
idx_str = tostring(idx)
else
idx_str = stringify(idx)
end
author_marks[#author_marks + 1] = {pandoc.Str(idx_str)}
end
if is_corresponding_author(author) then
author_marks[#author_marks + 1] = get_mark 'corresponding_author'
end
local res = List.clone(author.name)
res[#res + 1] = pandoc.Superscript(intercalate(author_marks, {pandoc.Str ','}))
return res
end
end
local function is_equal_contributor (author)
return author.equal_contributor
end
--- Create equal contributors note.
local function create_equal_contributors_block(authors, mark)
local has_equal_contribs = List:new(authors):find_if(is_equal_contributor)
if not has_equal_contribs then
return nil
end
local contributors = {
pandoc.Superscript(mark'equal_contributor'),
pandoc.Space(),
pandoc.Str 'These authors contributed equally to this work.'
}
return List:new{pandoc.Para(contributors)}
end
--- Generate a block list all affiliations, marked with arabic numbers.
local function create_affiliations_blocks(affiliations)
local affil_lines = List:new(affiliations):map(
function (affil, i)
local num_inlines = List:new{
pandoc.Superscript{pandoc.Str(tostring(i))},
pandoc.Space()
}
return num_inlines .. affil.name
end
)
return {pandoc.Para(intercalate(affil_lines, {pandoc.LineBreak()}))}
end
--- Generate a block element containing the correspondence information
local function create_correspondence_blocks(authors, mark)
local corresponding_authors = List:new{}
for _, author in ipairs(authors) do
if is_corresponding_author(author) then
local mailto = 'mailto:' .. pandoc.utils.stringify(author.email)
local author_with_mail = List:new(
author.name .. List:new{pandoc.Space(), pandoc.Str '<'} ..
author.email .. List:new{pandoc.Str '>'}
)
local link = pandoc.Link(author_with_mail, mailto)
table.insert(corresponding_authors, {link})
end
end
if #corresponding_authors == 0 then
return nil
end
local correspondence = List:new{
pandoc.Superscript(mark'corresponding_author'),
pandoc.Space(),
pandoc.Str'Correspondence:',
pandoc.Space()
}
local sep = List:new{pandoc.Str',', pandoc.Space()}
return {
pandoc.Para(correspondence .. intercalate(corresponding_authors, sep))
}
end
--- Generate a list of inlines containing all authors.
local function create_authors_inlines(authors, mark)
local inlines_generator = author_inline_generator(mark)
local inlines = List:new(authors):map(inlines_generator)
local and_str = List:new{pandoc.Space(), pandoc.Str'and', pandoc.Space()}
local last_author = inlines[#inlines]
inlines[#inlines] = nil
local result = intercalate(inlines, {pandoc.Str ',', pandoc.Space()})
if #authors > 1 then
result:extend(List:new{pandoc.Str ","} .. and_str)
end
result:extend(last_author)
return result
end
return {
{
Pandoc = function (doc)
local meta = doc.meta
local body = List:new{}
local mark = function (mark_name) return default_marks[mark_name] end
body:extend(create_equal_contributors_block(doc.meta.author, mark) or {})
body:extend(create_affiliations_blocks(doc.meta.institute) or {})
body:extend(create_correspondence_blocks(doc.meta.author, mark) or {})
body:extend(doc.blocks)
-- Overwrite authors with formatted values. We use a single, formatted
-- string for most formats. LaTeX output, however, looks nicer if we
-- provide a authors as a list.
meta.author = FORMAT:match 'latex'
and pandoc.MetaList(doc.meta.author):map(author_inline_generator(mark))
or pandoc.MetaInlines(create_authors_inlines(doc.meta.author, mark))
-- Institute info is now baked into the affiliations block.
meta.institute = nil
return pandoc.Pandoc(body, meta)
end
}
}

1
complie.sh Executable file
View File

@@ -0,0 +1 @@
pandoc -o output.pdf abstract.md --lua-filter=scholarly-metadata.lua --lua-filter=author-info-blocks.lua --citeproc --bibliography=ref.bib --csl=ieee.csl

519
ieee.csl Normal file
View File

@@ -0,0 +1,519 @@
<?xml version="1.0" encoding="utf-8"?>
<style xmlns="http://purl.org/net/xbiblio/csl" class="in-text" version="1.0" demote-non-dropping-particle="sort-only">
<info>
<title>IEEE Reference Guide version 11.29.2023</title>
<title-short>Institute of Electrical and Electronics Engineers</title-short>
<id>http://www.zotero.org/styles/ieee</id>
<link href="http://www.zotero.org/styles/ieee" rel="self"/>
<link href="https://journals.ieeeauthorcenter.ieee.org/your-role-in-article-production/ieee-editorial-style-manual/" rel="documentation"/>
<author>
<name>Michael Berkowitz</name>
<email>mberkowi@gmu.edu</email>
</author>
<contributor>
<name>Julian Onions</name>
<email>julian.onions@gmail.com</email>
</contributor>
<contributor>
<name>Rintze Zelle</name>
<uri>http://twitter.com/rintzezelle</uri>
</contributor>
<contributor>
<name>Stephen Frank</name>
<uri>http://www.zotero.org/sfrank</uri>
</contributor>
<contributor>
<name>Sebastian Karcher</name>
</contributor>
<contributor>
<name>Giuseppe Silano</name>
<email>g.silano89@gmail.com</email>
<uri>http://giuseppesilano.net</uri>
</contributor>
<contributor>
<name>Patrick O'Brien</name>
</contributor>
<contributor>
<name>Brenton M. Wiernik</name>
</contributor>
<contributor>
<name>Oliver Couch</name>
<email>oliver.couch@gmail.com</email>
</contributor>
<contributor>
<name>Andrew Dunning</name>
<uri>https://orcid.org/0000-0003-0464-5036</uri>
</contributor>
<category citation-format="numeric"/>
<category field="engineering"/>
<category field="generic-base"/>
<summary>IEEE style as per the 2023 guidelines.</summary>
<updated>2024-03-27T11:41:27+00:00</updated>
<rights license="http://creativecommons.org/licenses/by-sa/3.0/">This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License</rights>
</info>
<locale xml:lang="en">
<date form="text">
<date-part name="month" form="short" suffix=" "/>
<date-part name="day" form="numeric-leading-zeros" suffix=", "/>
<date-part name="year"/>
</date>
<terms>
<term name="chapter" form="short">ch.</term>
<term name="chapter-number" form="short">ch.</term>
<term name="presented at">presented at the</term>
<term name="available at">available</term>
<!-- always use three-letter abbreviations for months -->
<term name="month-06" form="short">Jun.</term>
<term name="month-07" form="short">Jul.</term>
<term name="month-09" form="short">Sep.</term>
</terms>
</locale>
<!-- Macros -->
<macro name="status">
<choose>
<if variable="page issue volume" match="none">
<text variable="status" text-case="capitalize-first" suffix="" font-weight="bold"/>
</if>
</choose>
</macro>
<macro name="edition">
<choose>
<if type="bill book chapter graphic legal_case legislation motion_picture paper-conference report song" match="any">
<choose>
<if is-numeric="edition">
<group delimiter=" ">
<number variable="edition" form="ordinal"/>
<text term="edition" form="short"/>
</group>
</if>
<else>
<text variable="edition" text-case="capitalize-first" suffix="."/>
</else>
</choose>
</if>
</choose>
</macro>
<macro name="issued">
<choose>
<if type="article-journal report" match="any">
<date variable="issued">
<date-part name="month" form="short" suffix=" "/>
<date-part name="year" form="long"/>
</date>
</if>
<else-if type="bill book chapter graphic legal_case legislation song thesis" match="any">
<date variable="issued">
<date-part name="year" form="long"/>
</date>
</else-if>
<else-if type="paper-conference" match="any">
<date variable="issued">
<date-part name="month" form="short"/>
<date-part name="year" prefix=" "/>
</date>
</else-if>
<else-if type="motion_picture" match="any">
<date variable="issued" form="text" prefix="(" suffix=")"/>
</else-if>
<else>
<date variable="issued" form="text"/>
</else>
</choose>
</macro>
<macro name="author">
<names variable="author">
<name and="text" et-al-min="7" et-al-use-first="1" initialize-with=". "/>
<label form="short" prefix=", " text-case="capitalize-first"/>
<et-al font-style="italic"/>
<substitute>
<names variable="editor"/>
<names variable="translator"/>
<text macro="director"/>
</substitute>
</names>
</macro>
<macro name="editor">
<names variable="editor">
<name initialize-with=". " delimiter=", " and="text"/>
<label form="short" prefix=", " text-case="capitalize-first"/>
</names>
</macro>
<macro name="director">
<names variable="director">
<name and="text" et-al-min="7" et-al-use-first="1" initialize-with=". "/>
<et-al font-style="italic"/>
</names>
</macro>
<macro name="locators">
<group delimiter=", ">
<text macro="edition"/>
<group delimiter=" ">
<text term="volume" form="short"/>
<number variable="volume" form="numeric"/>
</group>
<group delimiter=" ">
<number variable="number-of-volumes" form="numeric"/>
<text term="volume" form="short" plural="true"/>
</group>
<group delimiter=" ">
<text term="issue" form="short"/>
<number variable="issue" form="numeric"/>
</group>
</group>
</macro>
<macro name="title">
<choose>
<if type="bill book graphic legal_case legislation motion_picture song standard software" match="any">
<text variable="title" font-style="italic"/>
</if>
<else>
<text variable="title" quotes="true"/>
</else>
</choose>
</macro>
<macro name="publisher">
<choose>
<if type="bill book chapter graphic legal_case legislation motion_picture paper-conference song" match="any">
<group delimiter=": ">
<text variable="publisher-place"/>
<text variable="publisher"/>
</group>
</if>
<else>
<group delimiter=", ">
<text variable="publisher"/>
<text variable="publisher-place"/>
</group>
</else>
</choose>
</macro>
<macro name="event">
<choose>
<!-- Published Conference Paper -->
<if type="paper-conference speech" match="any">
<choose>
<if variable="container-title" match="any">
<group delimiter=" ">
<text term="in"/>
<text variable="container-title" font-style="italic"/>
</group>
</if>
<!-- Unpublished Conference Paper -->
<else>
<group delimiter=" ">
<text term="presented at"/>
<text variable="event"/>
</group>
</else>
</choose>
</if>
</choose>
</macro>
<macro name="access">
<choose>
<if type="webpage post post-weblog" match="any">
<!-- https://url.com/ (accessed Mon. DD, YYYY). -->
<choose>
<if variable="URL">
<group delimiter=". " prefix=" ">
<group delimiter=": ">
<text term="accessed" text-case="capitalize-first"/>
<date variable="accessed" form="text"/>
</group>
<text term="online" prefix="[" suffix="]" text-case="capitalize-first"/>
<group delimiter=": ">
<text term="available at" text-case="capitalize-first"/>
<text variable="URL"/>
</group>
</group>
</if>
</choose>
</if>
<else-if match="any" variable="DOI">
<!-- doi: 10.1000/xyz123. -->
<text variable="DOI" prefix=" doi: " suffix="."/>
</else-if>
<else-if variable="URL">
<!-- Accessed: Mon. DD, YYYY. [Medium]. Available: https://URL.com/ -->
<group delimiter=". " prefix=" " suffix=". ">
<!-- Accessed: Mon. DD, YYYY. -->
<group delimiter=": ">
<text term="accessed" text-case="capitalize-first"/>
<date variable="accessed" form="text"/>
</group>
<!-- [Online Video]. -->
<group prefix="[" suffix="]" delimiter=" ">
<choose>
<if variable="medium" match="any">
<text variable="medium" text-case="capitalize-first"/>
</if>
<else>
<text term="online" text-case="capitalize-first"/>
<choose>
<if type="motion_picture">
<text term="video" text-case="capitalize-first"/>
</if>
</choose>
</else>
</choose>
</group>
</group>
<!-- Available: https://URL.com/ -->
<group delimiter=": " prefix=" ">
<text term="available at" text-case="capitalize-first"/>
<text variable="URL"/>
</group>
</else-if>
</choose>
</macro>
<macro name="page">
<choose>
<if type="article-journal" variable="number" match="all">
<group delimiter=" ">
<text value="Art."/>
<text term="issue" form="short"/>
<text variable="number"/>
</group>
</if>
<else>
<group delimiter=" ">
<label variable="page" form="short"/>
<text variable="page"/>
</group>
</else>
</choose>
</macro>
<macro name="citation-locator">
<group delimiter=" ">
<choose>
<if locator="page">
<label variable="locator" form="short"/>
</if>
<else>
<label variable="locator" form="short" text-case="capitalize-first"/>
</else>
</choose>
<text variable="locator"/>
</group>
</macro>
<macro name="geographic-location">
<group delimiter=", " suffix=".">
<choose>
<if variable="publisher-place">
<text variable="publisher-place" text-case="title"/>
</if>
<else-if variable="event-place">
<text variable="event-place" text-case="title"/>
</else-if>
</choose>
</group>
</macro>
<!-- Series -->
<macro name="collection">
<choose>
<if variable="collection-title" match="any">
<text term="in" suffix=" "/>
<group delimiter=", " suffix=". ">
<text variable="collection-title"/>
<text variable="collection-number" prefix="no. "/>
<text variable="volume" prefix="vol. "/>
</group>
</if>
</choose>
</macro>
<!-- Citation -->
<citation>
<sort>
<key variable="citation-number"/>
</sort>
<layout delimiter=", ">
<group prefix="[" suffix="]" delimiter=", ">
<text variable="citation-number"/>
<text macro="citation-locator"/>
</group>
</layout>
</citation>
<!-- Bibliography -->
<bibliography entry-spacing="0" second-field-align="flush">
<layout>
<!-- Citation Number -->
<text variable="citation-number" prefix="[" suffix="]"/>
<!-- Author(s) -->
<text macro="author" suffix=", "/>
<!-- Rest of Citation -->
<choose>
<!-- Specific Formats -->
<if type="article-journal">
<group delimiter=", ">
<text macro="title"/>
<text variable="container-title" font-style="italic" form="short"/>
<text macro="locators"/>
<text macro="page"/>
<text macro="issued"/>
<text macro="status"/>
</group>
<choose>
<if variable="URL DOI" match="none">
<text value="."/>
</if>
<else>
<text value=","/>
</else>
</choose>
<text macro="access"/>
</if>
<else-if type="paper-conference speech" match="any">
<group delimiter=", " suffix=", ">
<text macro="title"/>
<text macro="event"/>
<text macro="editor"/>
</group>
<text macro="collection"/>
<group delimiter=", " suffix=".">
<text macro="publisher"/>
<text macro="issued"/>
<text macro="page"/>
<text macro="status"/>
</group>
<text macro="access"/>
</else-if>
<else-if type="chapter">
<group delimiter=", " suffix=".">
<text macro="title"/>
<group delimiter=" ">
<text term="in" suffix=" "/>
<text variable="container-title" font-style="italic"/>
</group>
<text macro="locators"/>
<text macro="editor"/>
<text macro="collection"/>
<text macro="publisher"/>
<text macro="issued"/>
<group delimiter=" ">
<label variable="chapter-number" form="short"/>
<text variable="chapter-number"/>
</group>
<text macro="page"/>
</group>
<text macro="access"/>
</else-if>
<else-if type="report">
<group delimiter=", " suffix=".">
<text macro="title"/>
<text macro="publisher"/>
<group delimiter=" ">
<text variable="genre"/>
<text variable="number"/>
</group>
<text macro="issued"/>
</group>
<text macro="access"/>
</else-if>
<else-if type="thesis">
<group delimiter=", " suffix=".">
<text macro="title"/>
<text variable="genre"/>
<text macro="publisher"/>
<text macro="issued"/>
</group>
<text macro="access"/>
</else-if>
<else-if type="software">
<group delimiter=". " suffix=".">
<text macro="title"/>
<text macro="issued" prefix="(" suffix=")"/>
<text variable="genre"/>
<text macro="publisher"/>
</group>
<text macro="access"/>
</else-if>
<else-if type="article">
<group delimiter=", " suffix=".">
<text macro="title"/>
<text macro="issued"/>
<group delimiter=": ">
<text macro="publisher" font-style="italic"/>
<text variable="number"/>
</group>
</group>
<text macro="access"/>
</else-if>
<else-if type="webpage post-weblog post" match="any">
<group delimiter=", " suffix=".">
<text macro="title"/>
<text variable="container-title"/>
</group>
<text macro="access"/>
</else-if>
<else-if type="patent">
<group delimiter=", ">
<text macro="title"/>
<text variable="number"/>
<text macro="issued"/>
</group>
<text macro="access"/>
</else-if>
<!-- Online Video -->
<else-if type="motion_picture">
<text macro="geographic-location" suffix=". "/>
<group delimiter=", " suffix=".">
<text macro="title"/>
<text macro="issued"/>
</group>
<text macro="access"/>
</else-if>
<else-if type="standard">
<group delimiter=", " suffix=".">
<text macro="title"/>
<group delimiter=" ">
<text variable="genre"/>
<text variable="number"/>
</group>
<text macro="geographic-location"/>
<text macro="issued"/>
</group>
<text macro="access"/>
</else-if>
<!-- Generic/Fallback Formats -->
<else-if type="bill book graphic legal_case legislation report song" match="any">
<group delimiter=", " suffix=". ">
<text macro="title"/>
<text macro="locators"/>
</group>
<text macro="collection"/>
<group delimiter=", " suffix=".">
<text macro="publisher"/>
<text macro="issued"/>
<text macro="page"/>
</group>
<text macro="access"/>
</else-if>
<else-if type="article-magazine article-newspaper broadcast interview manuscript map patent personal_communication song speech thesis webpage" match="any">
<group delimiter=", " suffix=".">
<text macro="title"/>
<text variable="container-title" font-style="italic"/>
<text macro="locators"/>
<text macro="publisher"/>
<text macro="page"/>
<text macro="issued"/>
</group>
<text macro="access"/>
</else-if>
<else>
<group delimiter=", " suffix=". ">
<text macro="title"/>
<text variable="container-title" font-style="italic"/>
<text macro="locators"/>
</group>
<text macro="collection"/>
<group delimiter=", " suffix=".">
<text macro="publisher"/>
<text macro="page"/>
<text macro="issued"/>
</group>
<text macro="access"/>
</else>
</choose>
</layout>
</bibliography>
</style>

BIN
image-1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

BIN
image.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 242 KiB

BIN
output.pdf Normal file

Binary file not shown.

55
ref.bib Normal file
View File

@@ -0,0 +1,55 @@
@article{rich_sonoporation_2022,
title = {Sonoporation: {Past}, {Present}, and {Future}},
volume = {7},
url = {https://advanced.onlinelibrary.wiley.com/doi/abs/10.1002/admt.202100885},
doi = {https://doi.org/10.1002/admt.202100885},
abstract = {Abstract A surge of research in intracellular delivery technologies is underway with the increased innovations in cell-based therapies and cell reprogramming. Particularly, physical cell membrane permeabilization techniques are highlighted as the leading technologies because of their unique features, including versatility, independence of cargo properties, and high-throughput delivery that is critical for providing the desired cell quantity for cell-based therapies. Amongst the physical permeabilization methods, sonoporation holds great promise and demonstrates to deliver a variety of functional cargos, such as biomolecular drugs, proteins, and plasmids, to various cells including cancer, immune, and stem cells. However, traditional bubble-based sonoporation methods usually require special contrast agents. Bubble-based sonoporation methods also have high chances of inducing irreversible damage to critical cell components, lowering the cell viability, and reducing the effectiveness of delivered cargos. To overcome these limitations, several novel non-bubble-based sonoporation mechanisms are under development. This review will cover both the bubble-based and non-bubble-based sonoporation mechanisms being employed for intracellular delivery, the technologies being investigated to overcome the limitations of traditional platforms, as well as perspectives on the future sonoporation mechanisms, technologies, and applications.},
number = {1},
journal = {Advanced Materials Technologies},
author = {Rich, Joseph and Tian, Zhenhua and Huang, Tony Jun},
year = {2022},
keywords = {acoustics, acoustofluidics, intracellular delivery, physical permeabilization, sonoporation},
pages = {2100885},
}
@article{fertier_love_2009,
title = {Love wave immunosensor for antibody recognition using an innovative semicarbazide surface functionalization},
volume = {140},
issn = {0925-4005},
url = {https://www.sciencedirect.com/science/article/pii/S0925400509003864},
doi = {https://doi.org/10.1016/j.snb.2009.04.069},
abstract = {A new novel and easy functionalization route of a Love wave acoustic sensor based on the α-oxo-semicarbazone bond is described. The interest is firstly to observe in real-time the immobilization of the peptide on the semicarbazide surface of the transducer and secondly to monitor the specific binding of antibodies. Site-specific immobilization of antigenic-peptides as well as binding of murine monoclonal antibodies has been shown by gravimetric measurements. A tetramethylrhodamine-labeled goat antibody directed against murine antibodies was used to further characterize the biomolecular interactions by fluorescence microscopy and surface analysis (by AFM). Our data show that the gravimetric monitoring developed from the prepared Love wave immunosensor is a promising alternative route to characterize chemical and biomolecular events.},
number = {2},
journal = {Sensors and Actuators B: Chemical},
author = {Fertier, Laurent and Cretin, Marc and Rolland, Marc and Durand, Jean-Olivier and Raehm, Laurence and Desmet, Rémi and Melnyk, Oleg and Zimmermann, Céline and Déjous, Corinne and Rebière, Dominique},
year = {2009},
keywords = {Real-time antibodies recognition monitoring, SAMs, Semicarbazide functionalization, SH-SAW, Surface modification},
pages = {616--622},
}
@article{shilton_nanoliter-droplet_2014,
title = {Nanoliter-{Droplet} {Acoustic} {Streaming} via {Ultra} {High} {Frequency} {Surface} {Acoustic} {Waves}},
volume = {26},
url = {https://advanced.onlinelibrary.wiley.com/doi/abs/10.1002/adma.201400091},
doi = {https://doi.org/10.1002/adma.201400091},
abstract = {The relevant length scales in sub-nanometer amplitude surface acoustic wave-driven acoustic streaming are demonstrated. We demonstrate the absence of any physical limitations preventing the downscaling of SAW-driven internal streaming to nanoliter microreactors and beyond by extending SAW microfluidics up to operating frequencies in the GHz range. This method is applied to nanoliter scale fluid mixing.},
number = {29},
journal = {Advanced Materials},
author = {Shilton, Richie J. and Travagliati, Marco and Beltram, Fabio and Cecchini, Marco},
year = {2014},
keywords = {acoustics, lab-on-a-chip, microfluidics, mixing, surface acoustic waves},
pages = {4941--4946},
}
@article{ding_-chip_2012,
title = {On-chip manipulation of single microparticles, cells, and organisms using surface acoustic waves},
volume = {109},
issn = {00278424},
language = {English},
number = {28},
journal = {Proceedings of the National Academy of Sciences of the United States of America},
author = {Ding, Xiaoyun and Lin, Sz-Chin Steven and Kiraly, Brian and Yue, Hongjun and Li, Sixing and Chiang, I-Kao and Shi, Jinjie and Benkovic, Stephen J. and Huang, Tony Jun},
year = {2012},
pages = {11105--11109},
}

199
scholarly-metadata.lua Normal file
View File

@@ -0,0 +1,199 @@
--[[
ScholarlyMeta – normalize author/affiliation meta variables
Copyright (c) 2017-2021 Albert Krewinkel, Robert Winkler
Permission to use, copy, modify, and/or distribute this software for any purpose
with or without fee is hereby granted, provided that the above copyright notice
and this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
THIS SOFTWARE.
]]
local List = require 'pandoc.List'
--- Returns the type of a metadata value.
--
-- @param v a metadata value
-- @treturn string one of `Blocks`, `Inlines`, `List`, `Map`, `string`, `boolean`
local function metatype (v)
if PANDOC_VERSION <= '2.16.2' then
local metatag = type(v) == 'table' and v.t and v.t:gsub('^Meta', '')
return metatag and metatag ~= 'Map' and metatag or type(v)
end
return pandoc.utils.type(v)
end
local type = pandoc.utils.type or metatype
-- Split a string at commas.
local function comma_separated_values(str)
local acc = List:new{}
for substr in str:gmatch('([^,]*)') do
acc[#acc + 1] = substr:gsub('^%s*', ''):gsub('%s*$', '') -- trim
end
return acc
end
--- Ensure the return value is a list.
local function ensure_list (val)
if type(val) == 'List' then
return val
elseif type(val) == 'Inlines' then
-- check if this is really a comma-separated list
local csv = comma_separated_values(pandoc.utils.stringify(val))
if #csv >= 2 then
return csv
end
return List:new{val}
elseif type(val) == 'table' and #val > 0 then
return List:new(val)
else
-- Anything else, use as a singleton (or empty list if val == nil).
return List:new{val}
end
end
--- Returns a function which checks whether an object has the given ID.
local function has_id (id)
return function(x) return x.id == id end
end
--- Copy all key-value pairs of the first table into the second iff there is no
-- such key yet in the second table.
-- @returns the second argument
function add_missing_entries(a, b)
for k, v in pairs(a) do
b[k] = b[k] or v
end
return b
end
--- Create an object with a name. The name is either taken directly from the
-- `name` field, or from the *only* field name (i.e., key) if the object is a
-- dictionary with just one entry. If neither exists, the name is left unset
-- (`nil`).
function to_named_object (obj)
local named = {}
if type(obj) == 'Inlines' then
-- Treat inlines as the name
named.name = obj
named.id = pandoc.utils.stringify(obj)
elseif type(obj) ~= 'table' then
-- if the object isn't a table, just use its value as a name.
named.name = pandoc.MetaInlines{pandoc.Str(tostring(obj))}
named.id = tostring(obj)
elseif obj.name ~= nil then
-- object has name attribute → just create a copy of the object
add_missing_entries(obj, named)
named.id = pandoc.utils.stringify(named.id or named.name)
elseif next(obj) and next(obj, next(obj)) == nil then
-- Single-entry table. The entry's key is taken as the name, the value
-- contains the attributes.
key, attribs = next(obj)
if type(attribs) == 'string' or type(attribs) == 'Inlines' then
named.name = attribs
else
add_missing_entries(attribs, named)
named.name = named.name or pandoc.MetaInlines{pandoc.Str(tostring(key))}
end
named.id = named.id and pandoc.utils.stringify(named.id) or key
else
-- this is not a named object adhering to the usual conventions.
error('not a named object: ' .. tostring(obj))
end
return named
end
--- Resolve institute placeholders to full named objects
local function resolve_institutes (institute, known_institutes)
local unresolved_institutes
if institute == nil then
unresolved_institutes = {}
elseif type(institute) == "string" or type(institute) == "number" then
unresolved_institutes = {institute}
else
unresolved_institutes = institute
end
local result = List:new{}
for i, inst in ipairs(unresolved_institutes) do
result[i] =
known_institutes[tonumber(inst)] or
known_institutes:find_if(has_id(pandoc.utils.stringify(inst))) or
to_named_object(inst)
end
return result
end
--- Insert a named object into a list; if an object of the same name exists
-- already, add all properties only present in the new object to the existing
-- item.
function merge_on_id (list, namedObj)
local elem, idx = list:find_if(has_id(namedObj.id))
local res = elem and add_missing_entries(namedObj, elem) or namedObj
local obj_idx = idx or (#list + 1)
-- return res, obj_idx
list[obj_idx] = res
return res, #list
end
--- Flatten a list of lists.
local function flatten (lists)
local result = List:new{}
for _, lst in ipairs(lists) do
result:extend(lst)
end
return result
end
--- Canonicalize authors and institutes
local function canonicalize(raw_author, raw_institute)
local institutes = ensure_list(raw_institute):map(to_named_object)
local authors = ensure_list(raw_author):map(to_named_object)
for _, author in ipairs(authors) do
author.institute = resolve_institutes(
ensure_list(author.institute),
institutes
)
end
-- Merge institutes defined in author objects with those defined in the
-- top-level list.
local author_insts = flatten(authors:map(function(x) return x.institute end))
for _, inst in ipairs(author_insts) do
merge_on_id(institutes, inst)
end
-- Add list indices to institutes for numbering and reference purposes
for idx, inst in ipairs(institutes) do
inst.index = pandoc.MetaInlines{pandoc.Str(tostring(idx))}
end
-- replace institutes with their indices
local to_index = function (inst)
return tostring(select(2, institutes:find_if(has_id(inst.id))))
end
for _, author in ipairs(authors) do
author.institute = pandoc.MetaList(author.institute:map(to_index))
end
return authors, institutes
end
return {
{
Meta = function(meta)
meta.author, meta.institute = canonicalize(meta.author, meta.institute)
return meta
end
}
}